2016-01-20 3 views
0

Я работаю над проектом, и я сложен так 2 дня, это моя проблема: У меня есть два arrays и хочу, чтобы получить второй элемент в каждом объекте в array_2 и concatenate это к содержимому каждого объекта вначале Array_1 в PHP.Как сцепить массивы элементов рекурсивен

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]...] 
+1

Вы сами что-то пробовали? Почему он не работает? Это должно быть довольно просто: создайте цикл, который проходит через array1 и array2, и сохраните элемент 0 (например, '1453274700000') в качестве ключа и элемента 1 (например,' 24011') в качестве значения. После этого просто пропустите оба из них и сопоставьте ключи. Если сортировка массивов всегда одинакова, вы можете сделать это с помощью одного цикла 'for'. – h2ooooooo

+0

Вы хотите объединить эти массивы в равные индексы каждого массива? –

ответ

1

Функциональное решение:

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

Это предполагает, что все элементы в порядке и их необходимо объединить только по их порядку, а не по их первому значению.

0

Используйте 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 
     ) 

) 

EDIT

Как @ 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); 

OUTPUT

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] => 
     ) 

) 
0

Если вы хотите $item[0], чтобы определить, к какой группе относится каждое значение, вы можете выполнить итерацию по первому массиву и сохранить $item[0] в качестве ключа и $item[1] в качестве значения. Сделайте то же самое для второго массива. Теперь итерации через сохраненный массив для array1, и проверьте, содержит ли сохраненный массив для массива 2 одинаковые ключи. Сделайте то же самое для массив2 (в случае, если он имеет ключ, который 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 
     ) 

) 

DEMO

Смежные вопросы