2016-05-11 5 views
2

Я попытался найти его, но не смог найти что-либо близко. Можно ли объединить два массива, но фактически часть второго массива?объединить часть массива рекурсивный php

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

Мой массив:

$ar1 = array(
    "locale" => "en-US", 
    "id" => 1, 
    "categories" => array(
     "0" => array("name" => "abc", "username" => "abc1"), 
     "1" => array("name" => "cdf", "username" => "bbb3"), 
    ) 
); 

$ar2 = array(
    "locale" => "en-US", 
    "id" => 1, 
    "categories" => array(
     "0" => array("name" => "xyz", "username" => "xyz4"), 
     "1" => array("name" => "zyx", "username" => "xtt44"), 
    ) 
); 

Я попытался array_merge, array_merge_recursive, но он не работает.

Я получаю

Array 
(
    [locale] => Array 
     (
      [0] => en-US 
      [1] => en-US 
     ) 

    [id] => Array 
     (
      [0] => 1 
      [1] => 1 
     ) 

    [categories] => Array 
     (
      [0] => Array 
       (
        [name] => abc 
        [username] => abc1 
       ) 

      [1] => Array 
       (
        [name] => cdf 
        [username] => bbb3 
       ) 

      [2] => Array 
       (
        [name] => xyz 
        [username] => xyz4 
       ) 

      [3] => Array 
       (
        [name] => zyx 
        [username] => xtt44 
       ) 

     ) 

) 

Но это то, что я хочу:

Array 
(
    [locale] => Array 
     (
      [0] => en-US 
     ) 

    [id] => Array 
     (
      [0] => 1 
     ) 

    [categories] => Array 
     (
      [0] => Array 
       (
        [name] => abc 
        [username] => abc1 
       ) 

      [1] => Array 
       (
        [name] => cdf 
        [username] => bbb3 
       ) 

      [2] => Array 
       (
        [name] => xyz 
        [username] => xyz4 
       ) 

      [3] => Array 
       (
        [name] => zyx 
        [username] => xtt44 
       ) 

     ) 

) 
+0

используя цикл foreach, вам нужно создать новый массив. –

+0

Могу ли я избежать foreach? Другого пути я не могу сделать? – push

+0

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

ответ

0

Это не может быть встроенная функция. Да; это всего лишь вложенный Loop с разветвленными условностями. Протестируйте это ... и посмотрите, что (самое главное) оно делает то, что вы хотите ... остальное - это вопрос выбора: Простота по сложности.

Вот Учитывая Массивы: $ ar1 и $ ar2

<?php 

     $ar1 = array(
      "locale" => "en-US", 
      "id" => 1, 
      "categories" => array(
       "0" => array("name" => "abc", "username" => "abc1"), 
       "1" => array("name" => "cdf", "username" => "bbb3"), 
      ) 
     ); 

     $ar2 = array(
      "locale" => "en-US", 
      "id" => 1, 
      "categories" => array(
       "0" => array("name" => "xyz", "username" => "xyz4"), 
       "1" => array("name" => "zyx", "username" => "xtt44"), 
      ) 
     ); 

И вот к Looping конструкта:

<?php 

     $arrResult = array(); 

     foreach($ar1 as $key=>$value){ 
      if(!array_key_exists($key, $arrResult)){ 

       if(is_array($value)){ 
        $arrResult[$key] = array(); 
        for($i=0; $i<count($value); $i++){ 
         $arrResult[$key][] = $value[$i]; 
        } 
       }else{ 
        $arrResult[$key] = $value; 
       } 

       foreach ($ar2 as $index => $item) { 
        if(!array_key_exists($index, $arrResult)){ 
         if(is_array($item)){ 
          if($key == $index) { 
           $arrResult[$index] = array(); 
           for ($j = 0; $j < count($item); $j++) { 
            $arrResult[$key][] = $item[$j]; 
           } 
          } 
         } 
        }else{ 
         if(is_array($item)){ 
          if($key == $index) { 
           for ($j = 0; $j < count($item); $j++) { 
            array_push($arrResult[$index], $item[$j]); 
           } 
          } 
         }else{ 
          $arrResult[$index] = $item; 
         } 
        } 
       } 

      } 
     } 

     var_dump($arrResult); 

?> 

Вот выход из var_dump ():

array (size=3) 
     'locale' => string 'en-US' (length=5) 
     'id' => int 1 
    'categories' => 
    array (size=4) 
     0 => 
     array (size=2) 
      'name' => string 'abc' (length=3) 
      'username' => string 'abc1' (length=4) 
     1 => 
     array (size=2) 
      'name' => string 'cdf' (length=3) 
      'username' => string 'bbb3' (length=4) 
     2 => 
     array (size=2) 
      'name' => string 'xyz' (length=3) 
      'username' => string 'xyz4' (length=4) 
     3 => 
     array (size=2) 
      'name' => string 'zyx' (length=3) 
      'username' => string 'xtt44' (length=5) 

Я по-прежнему считаю, что вам может понадобиться добавить свою собственную логику (если вам это нравится) в зависимости от вашего прецедента и предпочтения.

+0

Я пробовал, и это именно то, что я хочу :). Спасибо за ваше решение. – push

0

Вы можете использовать array_replace или array_replace_recursive. Или эта функция Я недавно написал (на основании некоторого кода найденного в Интернете): https://gist.github.com/jehaby/e91b6d35661ba8900644e5d64cc0055b

+0

Пробовал вашу функцию git, она заменяет мой массив и посылает мне это: http: // prntscr.com/b2trfx , но если я изменю свой ключ, он будет работать для всех функций http://prntscr.com/b2trlw (array_merge, array_merge_recursive) – push

0

Либо array_combine или используя array_merge так:

array_merge($ar1, $ar2['categories']); 
+0

Я пробовал, что он делает: http://prntscr.com/b2tqbn – push

+0

Ах, прости, я этого не видел. Похоже, у вас есть рабочее решение от Стаса Макрава, правда? –

+0

Нет, что не работает. – push

0

Вы должны использовать цикл Еогеасп здесь. Потому что ваш индекс похож.

$result = array(); 

$result['locale'] = array('en-US'); 
$result['id'] = array(1); 
foreach($ar1['categories'] as $val){ 
    $result['categories'][] = array('name' => $val['name'], 'username' => $val['username']); 
} 

foreach($ar2['categories'] as $val){ 
    $result['categories'][] = array('name' => $val['name'], 'username' => $val['username']); 
} 

echo '<pre>'; 
print_r($result); 

Результат

Array 
(
    [locale] => Array 
    (
     [0] => en-US 
    ) 

    [id] => Array 
    (
     [0] => 1 
    ) 
    [categories] => Array 
     (
      [0] => Array 
       (
        [name] => abc 
        [username] => abc1 
       ) 

      [1] => Array 
       (
        [name] => cdf 
        [username] => bbb3 
       ) 

      [2] => Array 
       (
        [name] => xyz 
        [username] => xyz4 
       ) 

      [3] => Array 
       (
        [name] => zyx 
        [username] => xtt44 
       ) 

     ) 

) 
+0

Это может быть правильно, но, как я уже сказал, у меня длинный список массивов, и это всего лишь часть. Я не могу вручную скопировать часть массива, как вы это делали, используя $ result ['locale'] = array ('en-US'); $ result ['id'] = array (1); Это не решит проблему. – push

+0

взгляните на ваш вход и желание ... –

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