如何内爆二维数组中的子数组?

How to implode subarrays in a 2-dimensional array?

如果值是数组,我想将值内爆到逗号分隔的字符串中:

我有以下数组:

$my_array = [
    "keywords" => "test",
    "locationId" => [ 0 => "1", 1 => "2"],
    "industries" => "1"
];

为了实现这一点,我有以下代码:

foreach ($my_array as &$value)
    is_array($value) ? $value = implode(",", $value) : $value;
unset($value);

以上也会改变原来的数组。有没有更优雅的方法来创建一个与上述相同的新数组?

我的意思是,如果值是一行代码中的数组,它们会内爆吗?也许 array_map()? ...但是我将不得不创建另一个函数。

只需将值附加到新数组:

$my_array = [
   "keywords" => "test",
   "locationId" => [ 0 => "1", 1 => "2"],
   "industries" => "1",
];
$new_Array = [];
foreach ($my_array as $value) {
    $new_Array[] = is_array($value) ? implode(",", $value) : $value;
}
print_r($new_Array);

以及可以称为 "one-liner"

的东西
$new_Array = array_reduce($my_array, function($t, $v) { $t[] = is_array($v) ? implode(",", $v) : $v; return $t; }, []);

现在比较两个解决方案并判断哪个更易读。

只需创建一个新数组并设置元素 (-;

<?php
...
$new_array = [];
foreach ($my_array as $key => $value)
     $new_array[$key] = is_array($value) ? implode(",", $value) : $value;

如果您 type 将字符串(非数组)作为单元素数组,则不需要 write/iterate 条件语句。

array_map(): (Demo)

$my_array = [
    "keywords" => "test",
    "locationId" => [ 0 => "1", 1 => "2"],
    "industries" => "1"
];

var_export(
    array_map(
        function($v) {
            return implode(',', (array)$v);
        },
        $my_array
    )
);

或来自PHP7.4, array_map() 带箭头函数语法:(Demo)

var_export(
    array_map(fn($v) => implode(',', (array)$v), $my_array)
);

array_walk()并参考修改(Demo)

array_walk(
    $my_array,
    function(&$v) {
        $v = implode(',', (array)$v);
    }
);
var_export($my_array);

或者 foreach 循环:(Demo)

foreach ($my_array as &$v) {
    $v = implode(',', (array)$v);
}
var_export($my_array);

所有片段将输出:

array (
  'keywords' => 'test',
  'locationId' => '1,2',
  'industries' => '1',
)