2017-02-02 9 views
0

У меня есть два массива ассоциативных массивов с разными ключами. Мне нужно объединить их в один массив ассоциативных массивов с нулями или пустыми строками для ключей, которые не существуют при более высоких индексах. Например:Объединение массивов ассоциативных массивов с пустыми значениями строк для отсутствующих ключей

$first = array(array('x'=>'1','y'=>'2')); 
$second = array(array('z'=>'3'),array('z'=>'4')); 

Результат должен выглядеть следующим образом:

$result = array(
    array(
     'x'=>'1', 
     'y'=>'2', 
     'z'=>'3' 
     ), 
    array(
     'x'=>'', 
     'y'=>'', 
     'z'=>'4' 
     ) 
    ); 

Функция, которая объединяет эти массивы необходимо, чтобы иметь возможность работать с двумя или более массивов. Вот что я придумал:

// allArrays can be many arrays of all sizes and will be different each time this process runs 
$allArrays = array($first, $second); 
$longestArray = max($allArrays); 
$data = array(); 
for($i = 0; $i < count($longestArray); ++$i) { 
    $dataRow = array(); 
    foreach ($allArrays as $currentArray) { 
     if (isset($currentArray[$i])) { 
      foreach ($currentArray[$i] as $key => $value) { 
       $dataRow[$key] = $value; 
      } 
     } else { 
      foreach ($currentArray[0] as $key => $value) { 
       $dataRow[$key] = ''; 
      } 
     }     
    } 
    $data[] = $dataRow; 
} 

Это работает, но я думаю, что вложенное для петель привести к снижению производительности на больших массивах, и это довольно неразборчиво. Есть ли лучший способ решить эту проблему?

+0

Слияние встроенных функций нескольких элементов, которые могут помочь и сделать вашу жизнь немного легче, проверьте их в руководстве. –

+0

Вы просмотрели http://php.net/manual/en/function.array-merge-recursive.php –

+0

@SanderBackus, его результаты более сложны, чем результаты функций функций array_merge_recursive. –

ответ

0

К сожалению, похоже, что это лучший способ решить эту проблему. Я отвечу на вопрос с примера сверху, если он поможет кому-либо в будущем.

// allArrays can be many arrays of all sizes and will be different each time this process runs 
$allArrays = array($first, $second); 
$longestArray = max($allArrays); 
$data = array(); 
for($i = 0; $i < count($longestArray); ++$i) { 
    $dataRow = array(); 
    foreach ($allArrays as $currentArray) { 
     if (isset($currentArray[$i])) { 
      foreach ($currentArray[$i] as $key => $value) { 
       $dataRow[$key] = $value; 
      } 
     } else { 
      foreach ($currentArray[0] as $key => $value) { 
       $dataRow[$key] = ''; 
      } 
     }     
    } 
    $data[] = $dataRow; 
}