Array
(
    [0] => Array
        (
            [color] => Brown
        )

    [1] => Array
        (
            [color] => Green
        )

    [2] => Array
        (
            [width] => 34
        )

)

我要这样做
[color] => Array
    (
        [0] => green
        [1] => brown
    )

[width] => Array
    (
        [0] => 34
    )


我在尝试所有的阵列工具。但我做不到我想要的。

最佳答案

所以你想递归地合并数组…如果只有such an array_merge_recursive功能存在…你为什么不试试这个:

$a = array(
    array('colour' => 'green'),
    array('colour' => 'blue'),
    array('width' => 123)
);
$result = array();
foreach($a as $arr)
{
    $result = array_merge_recursive($result, $arr);
}
var_dump($result);

这对我来说非常管用,as you can see for yourself here, too
是的,在给定的示例中width不是数组,因此可以得到:
array('colour' => array('green','blue'),'width' => 123);

如果您需要将所有内容都作为一个数组,那么一个肮脏的修复方法就是使用强制转换:
foreach($result as $k => $v) $result[$k] = (array) $v;

第二次重新分配$result值,只将它们转换为数组,可以确保所有值显然都是数组。转换为数组的数组将保持不变,就像(int) 1的计算结果仍为1一样。原始值(字符串、整数、双精度数,…)将在数组中包装,但对象将转换为数组,因此要小心。如果对象可能出现在此数组中:
foreach($result as $k => $v) $result[$k] = is_array($v) ? $v : array($v);

可能是更安全的选择。然而,我选择不采用这种方法,因为我仍然觉得将所有内容打包成一个数组(只包含1个值)是非常乏味和愚蠢的……
对于那些对不可维护的代码有着奇怪偏好的人,下面的一行代码是一个压缩的,但是请注意,相同代码的自由工作示例:
foreach($a as $arr) $result = array_merge_recursive(isset($result) ? $result : array(), $arr);

这是对斯图尔特·韦克菲尔德建议使用“一行”的回应,这是我一直反对的,因为只要我活着和呼吸,顺便说一句……

10-06 05:24
查看更多