2015-12-19 7 views
5

Sto cercando di capire le differenze tra array_replace() e array_merge(). La domanda mi è venuta in mente dopo questo post: PHP array_merge empty values always less prioritar, dove il problema può essere risolto con una di queste due funzioni. Quindi, stavo cercando di scoprire in quali casi dovremmo usare array_replace anziché array_merge e viceversa.Differenze tra array_replace e array_merge in PHP

Dopo aver letto la documentazione di PHP per entrambe le funzioni, trovo queste due differenze:

  1. Se gli array contengono tasti numerici, il valore entro e non sovrascriverà il valore originale in array_merge(), che sarà effettuata in array_replace() .
  2. In array_merge(), i valori nell'array di input con i tasti numerici verranno rinumerati con chiavi incrementali a partire da zero nell'array dei risultati, che non dovrebbe verificarsi con un rray_replace().

Dal momento che le differenze sono legate solo ai tasti numerici, possiamo tranquillamente dire che, le funzioni e array_replace()array_merge() sono esattamente equivalenti quando abbiamo a che fare con gli array associativi? O c'è qualche altra differenza che mi manca?

+0

Si dovrebbe provare e vedere quello che si ottiene :) – zpr

+0

@zpr Provare cosa? Se vedi la domanda e le risposte riferite, la soluzione funziona con entrambe le funzioni. Ma sto solo cercando di sapere se ci possono essere altri casi, quando queste due funzioni non danno lo stesso risultato per gli array associativi. –

risposta

6

Per gli array con chiavi stringa, sì, questi sono equivalenti, come hai menzionato. Se si dispone di tasti numerici, array_merge() li aggiungerà come richiesto e li potrà anche riordinare se necessario, mentre array_replace() sovrascriverà i valori originali.

Ad esempio,

$a = array('a' => 'hello', 'b' => 'world'); 
$b = array('a' => 'person', 'b' => 'thing', 'c'=>'other', '15'=>'x'); 

print_r(array_merge($a, $b)); 
/*Array 
(
    [a] => person 
    [b] => thing 
    [c] => other 
    [0] => x 
)*/ 

print_r(array_replace($a, $b)); 
/*Array 
(
    [a] => person 
    [b] => thing 
    [c] => other 
    [15] => x 
)*/ 

Come si può vedere, array_merge ha reindicizzati i tasti numerici della matrice, ed entrambi semplicemente aggiornare chiavi stringa.

Tuttavia, quando si dispone di tasti numerici, array_merge() sarà semplicemente non si preoccupano di chiavi, e aggiungere tutto nell'ordine che vede, l'eliminazione di nulla, mentre array_replace() volontà, come suggerisce il nome, sostituire le chiavi con simili indici (numerici):

<?php 
$a = array('0'=>'a', '1'=>'c'); 
$b = array('0'=>'b'); 

print_r(array_merge($a, $b)); 
/*Array 
(
    [0] => a 
    [1] => c 
    [2] => b 
)*/ 

print_r(array_replace($a, $b)); 
/*Array 
(
    [0] => b 
    [1] => c 
)*/ 
+0

Va notato che se gli array condividono un codice numerico c'è una differenza significativa. Unisci conserverà i contenuti originali, mentre la sostituzione è distruttiva. – tbernard

+0

@tbernard Cosa intendi? Come influisce sul contenuto (non solo sulle chiavi)? –

+1

@TareqMahmood Ciò che intendo è questo. Dato $ a = {0 => 'ciao'} e $ b = {0 => 'addio'} quindi array_merge ($ a, $ b) = {0 => 'ciao', 1 => 'addio'} considerando che array_replace ($ a, $ b) = {0 => 'addio'}. Quando le chiavi sono numeriche e non associative, sostituire sostituisce letteralmente.Le due funzioni ** only ** si comportano allo stesso modo per chiavi o chiavi associative che non si trovano in entrambi gli array di input. – tbernard