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.
Was ist, wenn '$ b' oder' $ c' Array mehr Werte haben als '$ a' Array? – Bhaskar
bearbeitet so jetzt ist es egal –