PHP combina due array associativi in ​​un array


87
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

Ho bisogno di un nuovo array che combini tutti insieme, cioè sarebbe

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

Qual è il modo migliore per farlo?

Scusa, dimenticavo, gli ID non corrisponderanno mai tra loro, ma tecnicamente i nomi potrebbero, ma non sarebbe probabile, e devono essere tutti elencati in un array. Ho guardato array_merge ma non ero sicuro che fosse il modo migliore per farlo. Inoltre, come lo testeresti?


5
Sembra che tu stia probabilmente solo cercando array_merge.
Corbin

Penso che il modo migliore, se sai che le chiavi sono tutte diverse, è usare l'operatore + =: $ array1 + = $ array2; Questo aggiunge tutti gli elementi di $ array2 alla fine di $ array1.
David Spector

Risposte:


130

array_merge() è più efficiente ma ci sono un paio di opzioni:

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }

7
Qual è il vantaggio di array_merge rispetto all'utilizzo dell'operatore?
jsteinmann

38
Unione di array (+): l'operatore + aggiunge gli elementi delle chiavi rimanenti dall'array per destrimani a quello per mancini, mentre le chiavi duplicate NON vengono sovrascritte. array_merge (): se gli array di input hanno le stesse chiavi di stringa, il valore successivo di quella chiave sovrascriverà quello precedente. Se, tuttavia, gli array contengono chiavi numeriche, il valore successivo non sovrascriverà il valore originale, ma verrà aggiunto. Se tutti gli array contengono solo chiavi numeriche, all'array risultante vengono fornite chiavi incrementali a partire da zero.
Samuel Cook

13
Va inoltre notato che array_mergerestituirà NULL se uno degli argomenti è NULL.
SeanWM

4
Se ci sono chiavi intere, verranno cambiate in chiavi intere A PARTIRE da 0. Fai molta attenzione con array_merge. Meglio usare un ciclo foreach per fare ciò che stai cercando di fare.
user2850305

24

Controlla array_merge().

$array3 = array_merge($array1, $array2);

22
@SudhanshuSaxena Considerando che sono stata la prima persona a postarla, non vedo come potrebbe essere una risposta ripetuta.
Brad

10

C'è anche array_replace, dove un array originale viene modificato da altri array preservando l' associazione chiave => valore senza creare chiavi duplicate.

  • Le stesse chiavi su altri array faranno sì che i valori sovrascriveranno l'array originale
  • Nuove chiavi su altri array verranno create sull'array originale

1
Questa è la risposta corretta. array_merge non funzionerà se hai chiavi numeriche (tutte le chiavi verranno convertite in indici coerenti).
Dmitry

3

Uso un wrapper attorno a array_merge per gestire il commento di SeanWM sugli array nulli; A volte voglio anche sbarazzarmi dei duplicati. Inoltre, in genere desidero unire un array in un altro, invece di creare un nuovo array. Questo finisce come:

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}

2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

Se è un array associativo numerico ma non sequenziale, è necessario utilizzare array_replace


0

Mi sono imbattuto in questa domanda cercando di identificare un modo pulito per unire due array di associazioni.

Stavo cercando di unire due diversi tavoli che non avevano relazioni tra loro.

Questo è ciò che mi è venuto in mente per PDO Query unendo due tabelle. Samuel Cook è ciò che ha identificato una soluzione per me con il array_merge()+1 a lui.

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

Forse questo aiuterà qualcun altro.


0

AGGIORNAMENTO Solo una breve nota, come posso vedere sembra davvero stupido, e non ha un buon uso con PHP puro perché array_mergefunziona solo lì. MA provalo con il driver PHP MongoDB prima di correre a downvote. Quel tizio aggiungerà indici per qualsiasi motivo e rovinerà l'oggetto unito. Con la mia piccola funzione ingenua, l'unione esce esattamente come avrebbe dovuto con un tradizionale array_merge.


So che è una vecchia domanda, ma vorrei aggiungere un altro caso che ho avuto di recente con query sui driver MongoDB e nessuno dei quali array_merge, array_replacearray_pushfunzionato. Avevo una struttura un po 'complessa di oggetti avvolti come array in array:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

E avevo bisogno di unirli mantenendo la stessa struttura in questo modo:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

La migliore soluzione che ho trovato è stata questa:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.