+ оператор для масиву в PHP?


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

Що +означає масив у PHP?


5
Я помічаю, що ваше запитання було +=і прийнято відповідь +. З мого тестування вони, схоже, поводяться так само.
користувач151841

7
Документації підводить підсумок досить добре
artfulrobot


@RobbieAverill - це питання, на яке посилається це Довідкове запитання. Так що якщо що-небудь, що довідкове питання - це дублікат
icc97

2
Хтось ще трохи злякався того, що така фундаментальна річ, як конкатенація масиву, має бути зроблена array_merge? Це як би масиви за замовчуванням асоціативні масиви, а числові масиви - громадяни другого класу.
icc97

Відповіді:


271

Цитування з посібника PHP про мовних операторів

Оператор + повертає правий масив, доданий до лівого масиву; для ключів, що існують в обох масивах, будуть використані елементи з лівого масиву, а відповідні елементи з правого масиву будуть ігноровані.

Так що якщо ви робите

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

print_r($array1 + $array2);

Ти отримаєш

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

Отже, логіка рівня +рівнозначна наступному фрагменту:

$union = $array1;

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

Якщо вас цікавлять деталі голови впровадження на рівні С


Зауважте, що +відрізняється від того, як array_merge()би поєднувати масиви:

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

дав би тобі

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
)

Більше прикладів див. На пов'язаних сторінках.


1
@Pacerier PHP, вироблений php.net, не має офіційних специфікацій, але як +і array_mergeдзвінок zend_hash_mergeпід кришкою. Цього також очікується, оскільки в PHP масиви реалізуються як упорядковані хеш-карти.
єпископ

1
@Pacerier Інтернет-документи php.net - це найближчий запис до специфікації, але IMO ці документи не відповідають справжній специфікації: один, вони оновлюються після написання коду; по-друге, вони не написані для покриття кожного спеціального використання.
єпископ

14
Поведінка PHP +і array_mergeє збоченою і неінтуїтивною. Вони протилежні тому, що звичайне англійське читання інтуїтивно скаже вам "додавання" або "об'єднання" масивів. Інші мови / бібліотеки використовують +для об'єднання списків (наприклад, в Python) та функцій "злиття" для додавання пар ключів / значень з одного об'єкта на інший (наприклад, в lodash). Однак у PHP це навпаки; array_mergeможе використовуватися для об'єднання масивів, подібних до списку, але +не може. На відміну від цього array_merge, +завжди виконує операцію, яку б називали "злиттям" в будь-якій іншій мові.
Марк Амері

1
@ icc97 вони справді лише HashMaps. Дивіться nikic.github.io/2014/12/22/…
Gordon

2
Я спробував надіслати помилку, щоб побачити, чи array_concatможе бути створений псевдонім array_merge.
icc97

18

Найкращий приклад, який я знайшов для використання цього, - це конфігураційний масив.

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

$config = $user_vars + $default_vars;

Як $default_varsце передбачає, це масив значень за замовчуванням. $user_varsМасив буде перезаписати значення , певні в $default_vars. Будь-які відсутні значення в $user_varsтепер є типовими значеннями $default_vars.

Це було б print_rтак:

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

Я сподіваюся, що це допомагає!


6

Цей оператор приймає об'єднання двох масивів (те саме, що array_merge, за винятком того, що з array_merge дублікати ключів перезаписуються).

Документація для операторів масиву знаходиться тут .


1
Обережне слово для початківців тут, результат операції є нульовим, якщо будь-який з масивів є нульовим . Деякі можуть не хвилюватися цим припущенням, оскільки це операція об'єднання, результатом буде правильний (ненульовий) масив, якщо один з них є нульовим. Але це справедливо, якщо один з масивів - порожній масив.
Sandeepan Nath

Отже, як гарна практика, я думаю, ми повинні ініціалізувати вхідні масиви як порожні масиви. Що ви кажете?
Sandeepan Nath

5

Обережно з цифровими клавішами, якщо їх потрібно зберегти або якщо ви нічого не хочете втрачати

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

союз

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

злиття

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

3

+Оператор виробляє одні і ті ж результати , як array_replace () . Однак оскільки аргументи оператора зворотні, впорядкування результуючого масиву також може бути різним.

Розширення на інший приклад з цієї сторінки:

$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

Виходи:

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
)

Чи порядок +гарантований специфікаціями? Про що array_replace?
Pacerier

1
  1. Операція Array плюс трактує весь масив як масив Assoc.
  2. Коли конфлікт ключів під час плюс, ліве (попереднє) значення зберігатиметься

Я розміщую код нижче, щоб все було зрозуміло.

$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;
}

@ Здійснення коду Тамліна, здається, доводить, що ваше твердження "масив плюс операція трактує весь масив як асоційований масив" є неправильним.
Pacerier

@Pacerier цей ключ також може бути цілим числом.
Хітеш


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

Масив ([0] => приклад [1] => тест)


1
Цей потік кілька разів згадує, як array_merge () НЕ збігається.
doublejosh

@doublejosh, "конгруентний"? Значення?
Pacerier

1
Вони не однакові.
doublejosh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.