+ PHP dizi için operatör?


192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

+PHP dizisi için ne anlama geliyor?


5
Sorunuzun olduğunu +=ve kabul edilen cevabın olduğunu fark ettim +. Testlerimden aynı gibi görünüyorlar.
user151841

7
Dokümantasyon oldukça iyi özetliyor
artfulrobot


@RobbieAverill - bu Referans sorununun atıfta bulunduğu sorudur. Referans sorusu yinelenen bir şey varsa
icc97

2
Dizi birleştirme gibi temel bir şeyin yapılması gerektiği konusunda biraz dehşete düşmüş array_mergemü? Sanki diziler varsayılan olarak ilişkilendirilebilir diziler ve sayısal diziler ikinci sınıf vatandaşlar gibidir.
icc97

Yanıtlar:


271

Dil Operatörleri için PHP Kılavuzundan Alıntı

+ İşleci, soldaki diziye eklenmiş sağdaki diziyi döndürür; her iki dizide de bulunan tuşlar için, sol dizideki öğeler kullanılır ve sağ dizideki eşleşen öğeler yok sayılır.

Yani eğer yaparsan

$array1 = ['one',   'two',          'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2);

Alacaksın

Array
(
    [0] => one   // preserved from $array1 (left-hand array)
    [1] => two   // preserved from $array1 (left-hand array)
    [foo] => bar // preserved from $array1 (left-hand array)
    [2] => five  // added from $array2 (right-hand array)
)

Yani mantığı +aşağıdaki snippet'e eşdeğerdir:

$union = $array1;

foreach ($array2 as $key => $value) {
    if (false === array_key_exists($key, $union)) {
        $union[$key] = $value;
    }
}

C düzeyi uygulama ayrıntıları ile ilgileniyorsanız,


Bunun dizileri +nasıl array_merge()birleştireceğinden farklı olduğuna dikkat edin:

print_r(array_merge($array1, $array2));

sana veririm

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => baz // overwritten from $array2
    [2] => three // appended from $array2
    [3] => four  // appended from $array2
    [4] => five  // appended from $array2
)

Daha fazla örnek için bağlantılı sayfalara bakın.


1
@Pacerier PHP resmi spec yok php.net tarafından üretilen, ancak her iki +ve array_mergeçağrı zend_hash_mergekaputun altında. PHP dizilerinde sıralı karma haritalar olarak uygulandığından bu da beklenir.
piskopos

1
@Pacerier php.net çevrimiçi dokümanları bir spesifikasyona en yakın kayıttır, ancak IMO bu dokümanlar gerçek bir spesifikasyonun çok altındadır: bir, kod yazıldıktan sonra güncellenir; iki, her özel kullanımı kapsayacak şekilde yazılmamışlardır.
piskopos

14
PHP davranış +ve array_mergesapkın ve sezgisel. Bunlar, basit bir İngilizce okumanın sezgisel olarak size 'ekleme' veya 'birleştirme' dizilerinin yapmasını söyleyeceğinin tam tersi. Diğer diller / kütüphaneler +, anahtarları / değer çiftlerini bir nesneden diğerine (örn. Lodash'ta) eklemek için listeleri birleştirmek (örneğin Python'da) ve "birleştirme" işlevlerini kullanır. Yine de PHP'de bu tam tersi; array_mergeliste benzeri dizileri birleştirmek için kullanılabilir, ancak kullanılamaz +. Bunun aksine array_merge, +her zaman başka bir dilde "birleştirme" olarak adlandırılan işlemi gerçekleştirir.
Mark Amery

1
@ icc97 onlar gerçekten sadece HashMaps. Bkz. Nikic.github.io/2014/12/22/…
Gordon

2
Bir takma adın oluşturulabileceğini görmek için bir hata göndermeyi denedim . array_concatarray_merge
icc97

18

Bunu kullanmak için bulduğum en iyi örnek bir yapılandırma dizisidir.

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");

$config = $user_vars + $default_vars;

$default_varsO da anlaşılacağı gibi, varsayılan değerler için dizidir. $user_varsDizi tanımlanan değerler değiştirilir $default_vars. İçindeki eksik değerler $user_varsartık varsayılan değerlerden farklıdır $default_vars.

Bu şöyle olur print_r:

Array(2){
    "username" => "John Doe",
    "email" => "no-reply@domain.com"
}

Umarım bu yardımcı olur!


6

Bu işleç iki dizinin birleşimini alır (array_merge ile aynıdır, ancak array_merge yinelenen anahtarların üzerine yazılır).

Dizi işleçlerinin belgeleri burada bulunur .


1
Burada yeni başlayanlar için dikkatli bir kelime, işlemin sonucu olan boş diziler herhangi biri olup olmadığını boş . Bazıları bu birleşme işlemi olduğu için bu varsayımı umursamayabilir, bunlardan biri boşsa sonuç uygun (boş olmayan) dizi olacaktır. Ancak, dizilerden biri boş bir dizi ise bu doğrudur .
Sandeepan Nath

Dolayısıyla, iyi bir uygulama olarak, girdi dizilerini boş diziler olarak başlatmalıyız. Ne diyorsunuz?
Sandeepan Nath

5

Korunması gerekiyorsa veya hiçbir şeyi kaybetmek istemiyorsanız, sayısal tuşlarla dikkat edin

$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");

Birlik

print_r($a+$b);
Array
(
    [2] => a2
    [4] => a4
    [5] => a5
    [1] => b1
    [3] => b3
)

birleştirmek

print_r(array_merge($a, $b));
Array
(
    [0] => a2
    [1] => a4
    [2] => a5
    [3] => b1
    [4] => b3
    [5] => b4
)

3

+Operatör aynı sonuçları verir array_replace () . Ancak işleç bağımsız değişkenleri tersine çevrildiği için, sonuçta elde edilen dizinin sırası da farklı olabilir.

Bu sayfadan başka bir örneğe genişleme:

$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz'); 

print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order

çıktılar:

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => bar // preserved from $array1
    [2] => five  // added from $array2
)
Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [2] => five  // added from $array2
    [foo] => bar // preserved from $array1
)

Sırasıdır +özellikleri tarafından garanti? Ne olmuş array_replace?
Pacerier

1
  1. Array plus işlemi tüm dizilere assoc dizisi gibi davranır.
  2. Artı sırasında önemli çakışma olduğunda, sol (önceki) değer korunur

İşleri netleştirmek için aşağıdaki kodu gönderiyorum.

$a + $b = array_plus($a, $b)

function array_plus($a, $b){
    $results = array();
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    return $results;
}

@ Tamlyn'in kod çalıştırması, "dizi artı işlemi tüm diziyi assoc dizisi olarak ele alıyor" iddianızın yanlış olduğunu kanıtlıyor gibi görünüyor .
Pacerier

@Pacerier bu anahtar da tamsayı olabilir.
Hitesh


-4
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);

Dizi ([0] => örnek [1] => test)


1
Bu iş parçacığı, array_merge () 'nin ne kadar uyumlu olmadığını birkaç kez belirtmektedir.
doublejosh

@doublejosh, "uyumlu" mu? Anlam?
Kalp pili

1
Aynı değiller.
doublejosh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.