$test = array('hi');
$test += array('test','oh');
var_dump($test);
Що +
означає масив у PHP?
array_merge
? Це як би масиви за замовчуванням асоціативні масиви, а числові масиви - громадяни другого класу.
$test = array('hi');
$test += array('test','oh');
var_dump($test);
Що +
означає масив у PHP?
array_merge
? Це як би масиви за замовчуванням асоціативні масиви, а числові масиви - громадяни другого класу.
Відповіді:
Цитування з посібника 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
)
Більше прикладів див. На пов'язаних сторінках.
+
і array_merge
дзвінок zend_hash_merge
під кришкою. Цього також очікується, оскільки в PHP масиви реалізуються як упорядковані хеш-карти.
+
і array_merge
є збоченою і неінтуїтивною. Вони протилежні тому, що звичайне англійське читання інтуїтивно скаже вам "додавання" або "об'єднання" масивів. Інші мови / бібліотеки використовують +
для об'єднання списків (наприклад, в Python) та функцій "злиття" для додавання пар ключів / значень з одного об'єкта на інший (наприклад, в lodash). Однак у PHP це навпаки; array_merge
може використовуватися для об'єднання масивів, подібних до списку, але +
не може. На відміну від цього array_merge
, +
завжди виконує операцію, яку б називали "злиттям" в будь-якій іншій мові.
array_concat
може бути створений псевдонім array_merge
.
Найкращий приклад, який я знайшов для використання цього, - це конфігураційний масив.
$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"
}
Я сподіваюся, що це допомагає!
Цей оператор приймає об'єднання двох масивів (те саме, що array_merge, за винятком того, що з array_merge дублікати ключів перезаписуються).
Документація для операторів масиву знаходиться тут .
Обережно з цифровими клавішами, якщо їх потрібно зберегти або якщо ви нічого не хочете втрачати
$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
)
+
Оператор виробляє одні і ті ж результати , як 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
?
- Операція Array плюс трактує весь масив як масив Assoc.
- Коли конфлікт ключів під час плюс, ліве (попереднє) значення зберігатиметься
Я розміщую код нижче, щоб все було зрозуміло.
$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;
}
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);
Масив ([0] => приклад [1] => тест)
+=
і прийнято відповідь+
. З мого тестування вони, схоже, поводяться так само.