Использование array_merge_recursive с цифровыми клавишами
Я искал SO и array_merge_recursive пару решений, которые все чувствуют, как хаки, чтобы обойти поведение по умолчанию array_merge_recursive на числовых клавишах. Например, я прочитал, что вы можете добавить подчеркивание к началу, изменив номер на строку.
Во всяком случае, здесь мои данные и предполагаемый результат.
Я уверен, что вы знаете, как array_merge_recursive нормально работает с числовыми ключами. Здесь мои текущие объединенные результаты.
Есть ли подходящий метод для этого? Каковы плюсы и минусы для отдельных методов, например добавление подчеркивания для создания строкового ключа?
array_merge_recursive
array_merge_recursive — рекурсивно объединяет два или более массивов.
Описание
array array_merge_recursive (array array1, array array2 [, array . ])
array_merge_recursive() объединяет элементы двух или более массивов так, что значения одного массива присоединяются в конец предыдущего. Возвращает результирующий массив.
Если массивы на входе имеют одинаковые строковые ключи, то значения этих ключей сливаются вместе, и это делается рекурсивно, то есть, если одно из значений это сам массив, функция объединит его с соответствующим вхождением другого массива. Если, однако, массивы имеют одинаковый числовой ключ, последнее значение не перезаписывает оригинальное, а будет присоединено.
Вопрос 1: рекурсивный или нет?
Но на этом вопрос не заканчивается. Я думал, array_*_resursive будет рекурсивная функция:
Рекурсия — это своего рода вызов функции, при котором функция вызывает себя. Такие функции также называются рекурсивными функциями. Структурная рекурсия — это метод решения проблемы, при котором решение проблемы зависит от решения более мелких случаев той же проблемы.
Оказывается, это не так. В то время как $array1 и $array2 ассоциативные массивы, как $array1[‘c’] и $array2[‘c’] из приведенного выше примера индексированные массивы с одним элементом: [1 => 500] . Давайте объединить их:
Это ожидаемый результат, потому что оба массива имеют числовую клавишу ( 1 ), поэтому второй будет добавлен к первому. Новый массив начинается с ключа 0. Но вернемся к самому первому примеру:
$array2[‘c’][1] добавлен, $array1[‘c’] но имеет ключи 1 и 2. Не 0 и 1 в предыдущем примере. Основной массив и его подмассивы обрабатываются по-разному при обработке целочисленных ключей.
Вопрос 2: Строковый или целочисленный ключ имеет большое значение.
При написании этого вопроса я нашел что-то еще. Это становится все более запутанным, если заменить числовой ключ строковым ключом в подмассиве:
Таким образом, использование строкового ключа приведет (int) 500 к тому array(500) , что использование целочисленного ключа не будет.
Может кто-нибудь объяснить это поведение?
Ответы (2)
плюса
1089 Репутация автора
Вы должны прочитать ссылку, которую вы указали (выделено мной):
Если входные массивы имеют одинаковые строковые ключи , то значения этих ключей объединяются в массив , и это делается рекурсивно, поэтому, если одно из значений является самим массивом, функция объединит его с соответствующей записью в другом массиве тоже. Однако, если массивы имеют одинаковый цифровой ключ , более позднее значение не будет перезаписывать исходное значение, а будет добавлено .
1 плюс
13527 Репутация автора
Если мы сделаем шаг назад и увидим, как array_merge*() функции ведут себя только с одним массивом, мы увидим, как он по-разному относится к ассоциативным и индексированным массивам:
Как видите, он взял все числовые ключи и проигнорировал их действительное значение и вернул их вам в той последовательности, в которой они встречались. Я полагаю, что функция делает это специально для поддержания здравого смысла (или эффективности) в базовом C-коде.
Возвращаясь к вашему примеру с двумя массивами, он взял значения $array1 , упорядочил их, а затем добавил $array2 .
Является ли это поведение вменяемым, это совершенно отдельная дискуссия .
Объединить массив с одинаковыми ключами, array_merge_recursive не работает должным образом — arrays
У меня есть два массива с идентификаторами как ключ и некоторые поля, и я хотел бы объединить их, но я не понимаю, почему это не работает, вот мой пример кода:
И есть результат, который мне нравится:
Я не понимаю, почему код, указанный на PHP.net, работает, а мой не
-
2 2
- 29 июл 2020 2020-07-29 18:24:59
- iBadGamer
2 ответа
Он не будет работать для числового ключа, поскольку описание функции говорит
Если входные массивы имеют одинаковые строковые ключи, значения этих ключей объединяются в массив, и это выполняется рекурсивно, так что, если одно из значений является массивом, функция будет объединять его с соответствующей записью в другом массиве тоже. Если, однако, массивы имеют один и тот же числовой ключ, более позднее значение не будет перезаписывать исходное значение, но будет добавлено.
- 29 июл 2020 2020-07-29 18:25:00
- Navneet Garg
Измените ключ 1234 на строку как
array_merge_recursive работает с строковыми ключами.
array_merge_recursive утверждает, что массив не является массивом
Я просмотрел сообщения здесь на SO, но не могу найти ничего, что, кажется, решает мою проблему. Я довольно новичок в PHP / MySQL, и я не могу понять, почему эта функция array_merge_recursive продолжает говорить мне, что мой первый массив не является массивом. Я проверил это, и все говорит мне, что это … пока он не достигнет этой функции. Вот мой код Я пытаюсь обработать несколько необязательных переменных из формы поиска (я изучил Sphinx / Lucene, но пока не могу их использовать). Во-первых, я обрабатываю некоторые переменные, которые были размещены на странице.
Затем я хочу объединить полученные массивы в один массив, который передается как одна переменная в остальную часть кода PHP.
[Разрывается на некоторый HTML здесь … и затем обрабатывается. Остальная часть кода работает. Я продолжаю получать сообщение об ошибке до того, как оно зашло так далеко
Я получаю сообщение об ошибке «array_merge_recursive (): Аргумент # 1 не является массивом». Есть идеи?
Решение
Вам нужно получить результат обратно из вашего запроса. mysqli :: query возвращает объект mysqli_result, а не массив.
Сделайте это для каждого из ваших запросов. Это тип объекта, который вы пытаетесь использовать:
http://php.net/manual/en/ >
Надеюсь, это поможет!
Другие решения
Вы должны инициализировать все массивы, которые вы используете в array_merge_recursive, потому что они не могут существовать в вашем коде.
Array_merge_recursive
Php функции
Php скрипты
array_merge_recursive
(PHP 4 >= 4.0.1, PHP 5)
array_merge_recursive — Рекурсивно слить два или большее количество массивов
Описание
array array_merge_recursive ( array array1, array array2 [ , array . ] )
Функция array_merge_recursive() сливает элементы двух или большего количества массивов таким образом, что значения одного массива присоединяются к значениям предыдущего. Результатом работы функции является новый массив.
Если входные массивы имеют одинаковые строковые ключи, тогда значения, соответствующие этим ключам, рекурсивно сливаются в один массив, таким образом, если одно из значений является массивом, функция сливает его с соответствующим значением в другом массиве. Однако, если массивы имеют одинаковые числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет слито с ним.
Пример 1. Пример использования array_merge_recursive()
$ar1 = array («color» => array («favorite» => «red»), 5); $ar2 = array (10, «color» => array («favorite» => «green», «blue»)); $result = array_merge_recursive ( $ar1 , $ar2 ); |
Переменная $result будет содержать:
Array ( [ color ] => Array ( [ favorite ] => Array ( [ 0 ] => red [ 1 ] => green ) [ 0 ] => 5 |
User Contributed Notes
jason at ebasterpro dot com
19-Aug-2005 08:56
This modifications allows you to merge arrays of objects and objects of arrays recursively.
/**
* arrayobj_merge_recursive2()
*
* Similar to array_merge_recursive2 but supports objects and arrays, keyed-valued are always overwritten.
* Priority goes to the 2nd array. And support Object Array mixture
*
* @static yes
* @public yes
* @param $paArray1 array /object
* @param $paArray2 array /object
* @return array /object
*/
function arrayobj_merge_recursive2( $paArray1 , $paArray2 )
<
if (is_array( $paArray2 ))
<
foreach ( $paArray2 AS $sKey2 => $sValue2 )
<
$paArray1 [ $sKey2 ] = arrayobj_merge_recursive2(@ $paArray1 [ $sKey2 ] , $sValue2 );
>
>
elseif (is_object( $paArray2 ))
<
foreach ( $paArray2 AS $sKey2 => $sValue2 )
<
$paArray1 -> < $sKey2 >= arrayobj_merge_recursive2(@ $paArray1 -> < $sKey2 >, $sValue2 );
>
> else <
return $paArray2 ;
>
return $paArray1 ;
>
mikeo
05-Apr-2005 07:42
Similarly, you can cast variables to type array. This is especially useful if you’re passing arrays by reference.
function addHeader(& $lArray , $description = null)
<
.
$lArray = array_merge_recursive(( array ) $lArray , $t mpArray );
.
>
fire at firepages dot com dot au
21-Dec-2004 06:10
PHP5 note , in PHP4 you could pass an uninitialised array to array_merge_recursive which would issue a notice but not break anything ..
while ( $whatever ) <
$uninitialised_array = array_merge_recursive( $uninitialised_array , $t ) ;
>
in PHP5 , if you dont initialise the array the recursion never starts so $uninitialised_array = array (); solves (good practive anyway I suppose?)
manicdepressive at mindless dot com
22-Jun-2004 06:30
Please be aware that under circumstances where you have
both the key and value common between the two arrays at a given node,
array_merge_recursive() will behave differently if that value is NULL,
as opposed to a non-null value.
i.e., I expected the results of the first two sections below to
have the same structure, but they don’t.
If this might apply to you, please see for yourself.
This behavior also occurs if the value is the empty array.
In fact, in the above example, interchanging the empty array with
any and all occurences of NULL will yield the same result.
code till dawn! -mark
brian at vermonster dot com
26-May-2004 01:44
Here is a fairly simple function that replaces while recursing.
/** * array_merge_recursive2() * * Similar to array_merge_recursive but keyed-valued are always overwritten. * Priority goes to the 2nd array. * * @static yes * @public yes * @param $paArray1 array * @param $paArray2 array * @return array */ function array_merge_recursive2 ( $paArray1 , $paArray2 ) < if ( ! is_array ( $paArray1 ) or ! is_array ( $paArray2 )) < return $paArray2 ; > foreach ( $paArray2 AS $sKey2 => $sValue2 ) < $paArray1 [ $sKey2 ] = array_merge_recursive2 (@ $paArray1 [ $sKey2 ] , $sValue2 ); > return $paArray1 ; > Examples: Result 1 is: Result 2 is: [ milk ] => wet This emulates replace of $_REQUEST according to variable_order=GPC.
Useful with stripping backslashes at beginning of main include file:
Based on examples from users from this site. Here my modification of shemari’s Code for Replacing Values in an Array. My modification will return the new Array, not handle it by reference. Hope it helps anyone. Most thanks goes to shemari ;o)
shemari75 at mixmail dot com Here’s a function to recursively merge any number of any-dimensional arrays. Usage:
|