2016-05-11 9 views
2

Ich habe versucht googeln, aber nicht in der Nähe zu finden. Ist es möglich, zwei Arrays zusammenzufassen, aber tatsächlich einen Teil des zweiten Arrays?verschmelzen einen Teil des Array rekursiv PHP

Diese Array wäre sehr lang und auf der zweiten möchte ich nur die Kategorien aus dem zweiten Array verwenden und zuerst einbinden!

Mein Array:

$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"), 
    ) 
); 

Ich versuchte array_merge, array_merge_recursive, aber es funktioniert nicht.

Ich erhalte

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 
       ) 

     ) 

) 

Aber das ist, was ich will:

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

Mit der 'foreach'-Schleife müssen Sie ein neues Array erstellen. –

+0

Kann ich foreach vermeiden? Es gibt keinen anderen Weg, den ich tun kann? – push

+0

Sie haben den gleichen Index in jedem Array, also in jeder Array-Funktion haben Sie nur einen Wert. –

Antwort

0

Dies kann nicht eine eingebaute Funktion sein. Ja; es ist nur eine verschachtelte Schleife mit verzweigten Bedingungen. Testen Sie es ... und sehen Sie, ob (am wichtigsten) es tut, was Sie wollen ... der Rest ist eine Frage der Wahl: Einfachheit über Komplexität.

Hier sind die Arrays an: $ ar1 und 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"), 
      ) 
     ); 

Und hier ist zum Looping Baukonstruktion:

<?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); 

?> 

Hier ist die Ausgabe der 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) 

Ich glaube immer noch, dass Sie möglicherweise Ihre eigene Logik hinzufügen müssen (wenn Sie es mögen), abhängig von Ihrem Anwendungsfall und Ihrer Präferenz.

+0

Ich habe versucht und das ist genau das, was ich will :). Danke für deine Lösung. – push

0

Sie könnten array_replace oder array_replace_recursive verwenden möchten. Oder diese Funktion, die ich vor kurzem schrieb (basierend auf einige Code im Internet zu finden): https://gist.github.com/jehaby/e91b6d35661ba8900644e5d64cc0055b

+0

Versucht Ihre Git-Funktion, ersetzt es mein Array und sende mir dies: http: // prntscr.com/b2trfx aber wenn ich meinen Schlüssel ändern funktioniert es für alle Funktionen http://prntscr.com/b2trlw (array_merge, array_merge_recursive) – push

0

Entweder array_combine oder mit array_merge wie folgt aus:

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

Ich habe versucht, was es tut, ist dies: http://prntscr.com/b2tqbn – push

+0

Ah ja Entschuldigung, ich habe das nicht gesehen. Sieht so aus als hättest du eine funktionierende Lösung von Stas Makraov bekommen, richtig? –

+0

Nein, das funktioniert nicht. – push

0

Sie müssen hier foreach-Schleife verwenden. Weil Ihre Indexe ähnlich sind.

$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); 

Ergebnis

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

Das könnte richtig sein, aber wie gesagt ich habe eine lange Liste von Array und das ist nur ein Teil. Ich kann den Teil des Arrays nicht manuell kopieren, wie Sie es mit $ result ['locale'] = array ('en-US') getan haben; $ result ['id'] = Array (1); Dies wird das Problem nicht lösen. – push

+0

werfen Sie einen Blick auf Ihre Eingabe und Wunsch Ausgabe .... –