2015-12-18 23 views
6

Il mio obiettivo è unire 2 array diversi.PHP array_merge valori vuoti sempre meno prioritari

Ho tabella "a" & "b". I dati della tabella "a" sono più prioritari.

PROBLEMA: se una chiave da "a" contiene un valore vuoto, vorrei prendere quello dalla tabella "b".

Ecco il mio codice:

<?php 

$a = array('key1'=> "key1 from prioritar", 'my_problem'=> ""); 

$b = array('key1'=> "key1 from LESS prioritar", 'key2'=>"key2 from LESS prioritar", 'my_problem'=> "I REACHED MY GOAL!"); 

$merge = array_merge($b, $a); 

var_dump($merge); 

C'è un modo per fare questo in una funzione senza fare qualcosa di simile qui sotto?

foreach($b as $key => $value) 
{ 
    if(!array_key_exists($key, $a) || empty($a[$key])) { 
    $a[$key] = $value; 
    } 
} 
+1

l'array '$ b' ha 2 indici' key2'? – roullie

+1

'! Array_key_exists || empty' è un'assurdità. Usarne uno andrà benissimo, a seconda che tu sia interessato a un confronto con 'false' o no. L'uso di entrambi insieme è lo stesso che usare semplicemente 'vuoto'. – deceze

+0

@roullie, grazie, questo era un errore – Bast

risposta

5

È possibile utilizzare array_replace e array_filter

$mergedArray = array_replace($b, array_filter($a)); 

Il risultato sarebbe:

array(3) { 
    ["key1"]=> 
    string(19) "key1 from prioritar" 
    ["key2"]=> 
    string(24) "key2 from LESS prioritar" 
    ["my_problem"]=> 
    string(18) "I REACHED MY GOAL!" 
} 
+2

Nota che 'array_filter ($ a) + $ b' andrà benissimo pure. – deceze

+1

@Matei, grazie mille. Questo è (quasi) ciò che stavo cercando. "quasi" perché inizialmente volevo mantenere il valore vuoto da "$ a" se la chiave non esiste in "$ b". Ma questo è già molto meglio di un foreach;) – Bast

2

Proprio array_filter()$a, che consente di eliminare ogni elemento con '' valore.

$merge = array_merge($b, array_filter($a)); 
+0

grazie, anche corretto :) – Bast

Problemi correlati