2017-04-26 7 views
0

Ich habe diese drei Felder:Array verschmelzen mit dem gleichen Schlüssel

Array 
(
    [1] => [email protected] 
    [2] => [email protected] 
    [3] => [email protected] 
) 

Array 
(
    [1] => 
    [2] => 4234235 
    [3] => 
) 

Array 
(
    [2] => 1 
) 

Und ich möchte diese Ausgabe erzeugen:

Array 
(
    [1] => array(
      [0] => [email protected] 
      ) 
    [2] => array(
      [0] => [email protected] 
      [1] => 4234235 
      [2] => 1 
      ) 
    [3] => array(
      [0] => [email protected] 
      ) 
) 

ich etwas Hilfe brauchen, weil ich schon array_merge_recursive() und array_merge() recherchiert, aber ich kann nicht das richtige Ergebnis erhalten.

Wenn ich foreach() verwenden muss, was muss ich tun, um diese 3 Arrays zusammenzuführen.

Antwort

4

Schrieb ein kleines Skript:

$a = array 
(
    1=>"[email protected]", 
    2=>"[email protected]", 
    3=>"[email protected]", 
); 

$b = array 
(
    2 => 4234235 
); 

$c = array 
(
    2 => 1 
); 

$arrayKeys = array_unique(
    array_merge(
     array_keys($a), 
     array_keys($b), 
     array_keys($c) 
    ) 
); 

$d = array_combine(
    $arrayKeys, 
    array_fill(
     0, 
     count($arrayKeys), 
     array() 
    ) 
); 

foreach($a as $key => $value) { 
    if(!empty($a[$key])) { 
     $d[$key][] = $a[$key]; 
    } 
    if(!empty($b[$key])) { 
     $d[$key][] = $b[$key]; 
    } 
    if(!empty($c[$key])) { 
     $d[$key][] = $c[$key]; 
    } 
} 
var_dump($d); 

Auch wenn Sie wollen Sie

nur
//names of the variables to merge together 
$arrayVariableNames = array("a","b","c"); 

//merging array keys together 
$arrayKeys = array(); 
foreach($arrayVariableNames as $variableName) { 
    $arrayKeys = array_merge(
     $arrayKeys, 
     array_keys(${$variableName}) 
    ); 
} 
$arrayKeys = array_unique($arrayKeys); 

//initialize the result array with empty arrays 
$resultArray = array_combine(
    $arrayKeys, 
    array_fill(
     0, 
     count($arrayKeys), 
     array() 
    ) 
); 

//loop through all the keys and add the elements from all the arrays 
foreach($resultArray as $key => &$value) { 
    foreach($arrayVariableNames as $variableName) { 
     if(!empty(${$variableName}[$key])) { 
      $value[] = ${$variableName}[$key]; 
     } 
    } 
} 
+0

Was ist, wenn '$ b' oder' $ c' Array mehr Werte haben als '$ a' Array? – Bhaskar

+0

bearbeitet so jetzt ist es egal –

1

Wie Sie sicherlich entdeckt haben, die Arrays mit den Variablennamen miteinander verschmelzen können, hartnäckig array_merge_recursive() alle zerschlägt numerische oder "numerische Zeichenfolge" Schlüssel in einem 1-dimensionalen Array. Um dieses Verhalten zu vermeiden, müssen Sie die anfänglichen Schlüssel jedes Arrays als Zeichenfolgen auf eine Weise darstellen, die von array_merge_recursive() nicht als eine Zahl angenommen wird.

Zusätzlich möchten Sie alle Elemente herausfiltern, die leere Werte haben.

Ich schrieb ursprünglich einen Einzeiler, der das Schlüssel-Re-Casting ausführte und dann die Werte filterte, aber auf diese Weise ist es weniger effizient. Für Ihren Fall sollten Sie nur array_filter() auf Arrays verwenden, die möglicherweise leere Werte enthalten.

Eingang Arrays:

$a=[1=>"[email protected]",2=>"[email protected]",3=>"[email protected]"]; 
$b=[1=>"",2=>"4234235",3=>""]; 
$c=[2=>1]; 

Code:

// remove empty values from all arrays that may have them 
$b=array_filter($b,'strlen'); 

// for all arrays, cast numeric keys to string by prepending with a space 
function addK($v){return " $v";} 
$a=array_combine(array_map('addK',array_keys($a)),$a); 
$b=array_combine(array_map('addK',array_keys($b)),$b); 
$c=array_combine(array_map('addK',array_keys($c)),$c); 

// merge arrays recursively 
$merged=array_merge_recursive($a,$b,$c); 

// cast keys back to numeric 
$merged=array_combine(array_map('trim',array_keys($merged)),$merged); 

// force all top-level elements to be arrays 
foreach($merged as $k=>$v){ 
    if(is_string($merged[$k])){$merged[$k]=[$v];} 
} 

var_export($merged); 

Ausgang:

array (
    1 => array (
     0 => '[email protected]', 
    ), 
    2 => array (
     0 => '[email protected]', 
     1 => '4234235', 
     2 => 1, 
    ), 
    3 => array (
     0 => '[email protected]', 
    ), 
) 

Für Leser, die den Unterschied wissen möchten, wann array_merge_recursive() ohne Vorbereitung läuft :

array (
    0 => '[email protected]', 
    1 => '[email protected]', 
    2 => '[email protected]', 
    3 => '', 
    4 => '4234235', 
    5 => '', 
    6 => 1, 
) 

Beachten Sie die 1D-Array und die neu indizierten Tasten? ... total nutzlos für das OP.

Endlich, für jeden, der die Schlüssel zu allen Arrays umwandeln möchte und meinen Prozess mehr DRY machen möchte, könnte es eine Möglichkeit geben, eine Variadic-Funktion oder ähnliches einzurichten. Ich habe mich einfach nicht darum gekümmert, weil ich meine Antwort nicht mehr komplex machen wollte und es ist keine schreckliche Menge, mich zu wiederholen.

+0

Ich mag katona.abel's Methoden, sie sind sehr schlau. Es gibt jedoch ein paar Unterschiede. Die erste Methode gibt dem Array '$ a' die Schleifenautorität, das OP hat dann kommentiert, um nach einer neuen Methode zu fragen, die eine größere Anzahl von Elementen in $ b und $ c erlaubt. Die zweite Methode (ich folge ihr nicht ganz so einfach, aber sie verwendet Variable-Variablen, um zu erreichen, wofür 'array_merge_recursive()' entworfen wurde.Ich habe ein paar Tests durchgeführt und Katonas zweite Methode scheint nicht zu kaputt zu sein - gute Codierung! Sollte jemand bei unseren Methoden einen Fehler finden, hinterlassen Sie uns bitte einen Kommentar. – mickmackusa

Verwandte Themen