2015-12-19 10 views
5

Próbuję ustalić różnice między array_replace() i array_merge(). Pytanie rzeczywiście przyszło mi do głowy po tym wpisie: PHP array_merge empty values always less prioritar, gdzie problem faktycznie można rozwiązać za pomocą dowolnej z tych dwóch funkcji. Tak więc, próbowałem dowiedzieć się, w których przypadkach powinniśmy użyć array_replace zamiast array_merge i na odwrót.Różnice między array_replace i array_merge w PHP

Po zapoznaniu się z dokumentacją PHP dla obu funkcji, uważam te dwie różnice:

  1. Jeśli tablice zawierają klawiszy numerycznych, późniejsza wartość nie nadpisze wartość początkową w array_merge(), które zostaną wykonane w array_replace() .
  2. W wartości w tablicy wejściowej z klawiszami numerycznymi zostaną ponumerowane z przyrostowymi klawiszami począwszy od zera w tablicy wyników, co nie powinno się zdarzyć z rray_replace().

Ponieważ różnice są związane jedynie z klawiatury numerycznej, możemy śmiało powiedzieć, że funkcjonuje array_replace() i array_merge() są dokładnie równoważne, gdy mamy do czynienia z asocjacyjnych? Czy jest jakakolwiek inna różnica, której mi brakuje?

+0

Powinieneś spróbować i zobaczyć co się dzieje :) – zpr

+0

@zpr Spróbuj co? Jeśli zobaczysz wskazane pytanie i odpowiedzi, rozwiązanie działa z obiema funkcjami. Ale ja tylko próbuję wiedzieć, czy mogą istnieć inne przypadki, kiedy te dwie funkcje nie dadzą tego samego wyniku dla tablic asocjacyjnych. –

Odpowiedz

6

Dla tablic z kluczami łańcuchowymi, tak są one równoważne, jak wspomniano. Jeśli masz klawisze numeryczne, array_merge() dołączy je zgodnie z wymaganiami, a nawet je ponownie uporządkuje, jeśli będzie to konieczne, natomiast array_replace() nadpisze oryginalne wartości.

Na przykład

$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 
)*/ 

Jak widać, array_merge został ponownie indeksowane klawiszy numerycznych na tablicy, i oba z nich po prostu zaktualizować klucze ciągów. Jednakże, jeśli masz klawisze numeryczne, array_merge() po prostu nie dba o klucze i dodaje wszystko w kolejności, w jakiej widzi, niczego nie usuwając, natomiast array_replace(), jak sama nazwa wskazuje, zastąpi klucze podobnymi (numerycznymi) indeksami:

<?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

Należy zauważyć, że jeśli tablice mają wspólny klucz numeryczny, występuje znacząca różnica. Scal zachowa oryginalną treść, a zastąpienie jest destrukcyjne. – tbernard

+0

@tbernard Co masz na myśli? Jak wpływa na zawartość (nie tylko klucze)? –

+1

@TareqMahmood Co mam na myśli, to jest to. Podane $ a = {0 => "cześć"} i $ b = {0 => "do widzenia"} to tablica_merge ($ a, $ b) = {0 => "cześć", 1 => "do widzenia"} array_replace ($ a, $ b) = {0 => 'do widzenia'}. Kiedy klawisze są numeryczne i nie łączą się, zastępuj je dosłownie.Dwie funkcje ** tylko ** zachowują się tak samo dla skojarzonych kluczy lub kluczy, które nie występują w obu tablicach wejściowych. – tbernard