PHP中如何实现两个数组的对应元素在同一行配对显示?
解决数组参数配对显示的问题
首先提个小细节:你定义的函数是getLists,但调用时写的是getList,这个拼写不一致的问题先修正下,避免运行报错。
问题根源
你的核心问题在于当第三个参数$optional是数组时,原代码里直接把$x和$optional拼接——PHP遇到数组转字符串时会自动转为"Array",这就是你看到警告和错误输出的原因。我们需要让$items数组的每个元素和$optional数组的对应索引元素配对,而不是把整个数组拼上去。
修改后的代码
function getLists($str, array $items, $optional = null) { // 处理元素配对逻辑 $items1 = array_map(function($x, $index) use ($optional) { // 判断$optional是否为数组,且对应索引存在元素 if (is_array($optional) && isset($optional[$index])) { return "$x {$optional[$index]}"; } // $optional是字符串的情况 elseif (is_string($optional)) { return "$x $optional"; } // 没有$optional的情况,直接返回原元素 return $x; }, $items, array_keys($items)); // 传入索引值供配对使用 $itemsCount = count($items1); $sentence = ''; if ($itemsCount == 1) { $sentence = $items1[0] . '.'; } else { // 合并前n-1个元素,最后用and连接 $partial = array_slice($items1, 0, $itemsCount - 1); $sentence = implode(', ', $partial) . ' and ' . $items1[$itemsCount - 1]; } return $str . ': ' . $sentence . '.'; }
关键改动说明
- 数组配对逻辑:在
array_map里额外传入了array_keys($items)来获取每个元素的索引,这样就能匹配$optional数组对应位置的元素。同时增加了索引存在的判断,避免数组越界的问题。 - 简化分支逻辑:原代码里重复的
implode逻辑被合并,不管$optional是字符串还是数组,最终都统一处理$items1数组,减少冗余代码。
测试调用
现在运行你有问题的调用:
echo getLists("The color required", array("green","red","blue"), ['chilli','onion','berry']);
会得到你期望的输出:
The color required: green chilli, red onion and blue berry.
另外两种正常调用也能保持原有功能:
// 无第三个参数 echo getLists("What do you want", array("chocolate","icecream","shake")); // 输出:What do you want: chocolate, icecream and shake. // 字符串第三个参数 echo getLists("Ice Cream has", array("chocolate","vanilla","mango"),"flavour"); // 输出:Ice Cream has: chocolate flavour, vanilla flavour and mango flavour.
内容的提问来源于stack exchange,提问作者ku234
相关产品推荐
相关产品推荐

