如何递归连接数组元素


How to concatenate arrays element recursively

我正在做一个项目,我从 2 天开始堆叠,这是我的问题:我有两个arrays,想检索Array_2中每个对象中的第二个项目,并将其concatenatePHP中第一个Array_1中每个对象的内容。

Array_1

 [[1453274700000,24011],[1453275000000,24222],[1453275300000,24284],[1453275600000,24331],...]

Array_2

[[1453274700000,51951],[1453275000000,52093],[1453275300000,52251],[1453275600000,52288],...] 

Wanted_array

[[1453274700000,24011,51951],[1453275000000,24222,52093],[1453275300000,24284,52251],[1453275600000,24331,52288]...]

一个功能性解决方案:

$result = array_map(function (array $a1, array $a2) {
    return array_merge($a1, [$a2[1]]);
}, $array_1, $array_2);

这假定所有项目都按顺序排列,并且只需要按其顺序合并,而不是按其第一个值合并。

如果您希望$item[0]定义每个值所属的"组",则可以循环访问第一个数组并将$item[0]保存为键,$item[1]保存为值。对第二个数组执行相同的操作。现在遍历 array1 的已保存数组,并检查为 array2 保存的数组是否包含相同的键。对 array2 执行相同的操作(如果它有 array1 没有的键),并将其全部保存到新数组中:

<?php
$arr1 = array(
        array('1453274700000',24011),
        array('1453275000000',24222),
        array('1453276000000',24222), // inexistent in $arr2
    );
$arr2 = array(
        array('1453275000000',52093),
        array('1453274700000',51951),
        array('1453273000000',24222), // inexistent in $arr1
    );
$arr1dictionary = [];
$arr2dictionary = [];
$result = [];
foreach ($arr1 as $collection) {
  $arr1dictionary[$collection[0]] = $collection[1];
}
foreach ($arr2 as $collection) {
  $arr2dictionary[$collection[0]] = $collection[1];
}
foreach ($arr1dictionary as $key => $value) {
  if (isset($arr2dictionary[$key])) {
    $result[$key] = [$key, $value, $arr2dictionary[$key]];
  } else {
    $result[$key] = [$key, $value, null];
  }
}
foreach ($arr2dictionary as $key => $value) {
  if (isset($result[$key])) {
    continue;
  }
  $result[$key] = [$key, null, $value];
}
$result = array_values($result);
print_r($result); 

输出

Array
(
    [0] => Array
        (
            [0] => 1453274700000
            [1] => 24011
            [2] => 51951
        )
    [1] => Array
        (
            [0] => 1453275000000
            [1] => 24222
            [2] => 52093
        )
    [2] => Array
        (
            [0] => 1453276000000
            [1] => 24222
            [2] => (null, the value only exists in $arr1)
        )
    [3] => Array
        (
            [0] => 1453273000000
            [1] => (null, the value only exists in $arr2)
            [2] => 24222
        )
)

演示

使用array_walk并从$array2中添加第二项(如果存在)。

$array1 = array(
    array(1453274700000,24011),
    array(1453275000000,24222),
    array(1453275300000,24284),
    array(1453275600000,24331)
    );
$array2 = array(
    array(1453274700000,51951),
    array(1453275000000,52093),
    array(1453275300000,52251),
    array(1453275600000,52288),
    );

array_walk($array1, function(&$item, $key) use ($array2){
    if(isset($array2[$key][1])){
        $item[] = $array2[$key][1];
    }
});
print_r($array1);

输出

Array
(
    [0] => Array
        (
            [0] => 1453274700000
            [1] => 24011
            [2] => 51951
        )
    [1] => Array
        (
            [0] => 1453275000000
            [1] => 24222
            [2] => 52093
        )
    [2] => Array
        (
            [0] => 1453275300000
            [1] => 24284
            [2] => 52251
        )
    [3] => Array
        (
            [0] => 1453275600000
            [1] => 24331
            [2] => 52288
        )
)

编辑

正如@h2ooooooo指出的那样,数组项可能是随机顺序的。如果数组项可以按随机顺序排列,并且它们与第一个索引值匹配,请使用以下命令(适用于 PHP>= 5.5.0):

$array1 = array(
    array(1453274700000,24011),
    array(1453275000000,24222),
    array(1453275300000,24284),
    array(1453275600000,24331),
    array(1453276000000,24222) // no match in $array2
    );
$array2 = array(
    array(1453275000000,52093),
    array(1453274700000,51951),
    array(1453275300000,52251),
    array(1453275600000,52288),
    );

array_walk($array1, function(&$item, $key) use ($array2){
    // Find match in $array2
    $array2_key = array_search($item[0], array_column($array2, 0));
    // If match found
    if($array2_key !== false && isset($array2[$array2_key][1])){
        $item[] = $array2[$array2_key][1];
    }
    // No match
    else{
        $item[] = null;
    }
});
print_r($array1);

输出

Array
(
    [0] => Array
        (
            [0] => 1453274700000
            [1] => 24011
            [2] => 51951
        )
    [1] => Array
        (
            [0] => 1453275000000
            [1] => 24222
            [2] => 52093
        )
    [2] => Array
        (
            [0] => 1453275300000
            [1] => 24284
            [2] => 52251
        )
    [3] => Array
        (
            [0] => 1453275600000
            [1] => 24331
            [2] => 52288
        )
    [4] => Array
        (
            [0] => 1453276000000
            [1] => 24222
            [2] => 
        )
)