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

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

Что значит + значит для массива в PHP?

9 ответов

Решение

Цитирование из руководства по языковым операторам 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;
    }
}

Если вы заинтересованы в деталях реализации уровня C, обратитесь к


Обратите внимание, что + отличается от того, как 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
)

Смотрите связанные страницы для большего количества примеров.

Лучший пример, который я нашел для использования этого, находится в массиве конфигурации.

$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
)
  1. Операция Array plus обрабатывает весь массив как ассоциированный массив.
  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;
}

Из https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

При этом мы могли бы считать оператор + избыточным, поскольку того же можно добиться с помощью функции array_replace.

Однако есть случаи, когда это удобно: скажем, у вас есть массив $options, который передается функции/методу, а также есть значения по умолчанию, которые можно использовать в качестве резерва:

      // we could do it like this
function foo(array $options)
{
   $defaults = ['foo' => 'bar'];
   
   $options = array_replace($defaults, $options);
 
   // ...
}
 
// but + here might be way better:
function foo(array $options)
{
   $options += ['foo' => 'bar'];
 
   // ...
}

Он добавит новый массив к предыдущему.

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

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

Другие вопросы по тегам