Intereting Posts
Использование Curl для получения удаленного источника страницы, как эхо только одна строка кода на основе его номера Ошибка с неверным пакетом во время MySQL LOAD DATA LOCAL INFILE Наследование динамического класса php Загрузка нескольких файлов изображений с использованием HttpURLConnection Могу ли я / Как … вызвать защищенную функцию вне класса в PHP? Модель Codeigniter Неопределенное свойство Класс «Mage_Googlecheckout_Helper_Data» не найден Некоторые помогают «синхронизировать» две петли в PHP Предупреждение: mysqli_fetch_assoc () ожидает, что параметр 1 будет mysqli_result, boolean задан в C: \ xampp \ htdocs \ xyz \ userpanel.php в строке 71 Magento SOAP API – исключение PHP для вызова метода входа: «похоже, что у нас нет XML-документа» Модуль Magento BestSeller – суммирование настраиваемых продуктов и добавление их обратно Что такое SAPI и когда вы его используете? Невозможно заставить PHP-функцию работать внутри HTML внутри PHP PHP Неустранимая ошибка: не очистить PDOException: не удалось найти драйвер Проверить пробелы в начале строки

Array_merge против +

Когда я использую array_merge() с ассоциативными массивами, я получаю то, что хочу, но когда я использую их с числовыми ключевыми массивами, ключи меняются.

С + ключи сохраняются, но не работают с ассоциативными массивами.

Я не понимаю, как это работает, может кто-нибудь объяснить это мне?

Поскольку оба массива численно проиндексированы, будут использоваться только значения в первом массиве.

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

http://php.net/manual/en/language.operators.array.php

array_merge() имеет несколько другое поведение:

Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущий. Если, однако, массивы содержат числовые клавиши, более поздняя величина не будет перезаписывать исходное значение, но будет добавлена. Значения во входном массиве с числовыми клавишами будут перенумерованы с добавочными клавишами, начиная с нуля в массиве результатов.

http://php.net/manual/en/function.array-merge.php

Эти две операции совершенно разные.

массив плюс

  1. Операция Array plus обрабатывает весь массив в качестве массива-члена.
  2. Когда ключевой конфликт во время плюс, останется левое (предыдущее) значение
  3. null + array() приведет к фатальной ошибке

array_merge ()

  1. array_merge () работает с индексом-массивом и ассоциативным массивом.
  2. Если оба параметра представляют собой индексный массив, массивы array_merge () concat index-array.
  3. Если нет, индекс-массив будет преобразовывать в массив значений, а затем преобразовывать в ассоциативный массив.
  4. Теперь он получил два массива и объединил их вместе, когда ключевой конфликт, право (последнее) значение будет сохранено.
  5. array_merge(null, array()) возвращает array () и получил предупреждение, параметр # 1 не является массивом.

Я размещаю код ниже, чтобы все было ясно.

 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; } //---------------------------------------------------------------- function is_index($a){ $keys = array_keys($a); foreach($keys as $key) { $i = intval($key); if("$key"!="$i") return false; } return true; } function array_merge($a, $b){ if(is_index($a)) $a = array_values($a); if(is_index($b)) $b = array_values($b); $results = array(); if(is_index($a) and is_index($b)){ foreach($a as $v) $results[] = $v; foreach($b as $v) $results[] = $v; } else{ foreach($a as $k=>$v) $results[$k] = $v; foreach($b as $k=>$v) $results[$k] = $v; } return $results; }