Что такое код array_merge_recursive


Использование 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
Илон Маск рекомендует:  Что такое код msql_freeresult

Измените ключ 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
[ 1 ] => 10
)

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:

$array 1 = array (
‘liquids’ => array (
‘water’ => array ( ‘cold’ , ‘fizzy’ , ‘clean’ )
, ‘beer’ => ‘warm’
)
);

$result 1 = array_merge_recursive2 ( $array 1 , $array 2 );
$result 2 = array_merge_recursive2 ( $array 2 , $array 1 );
?>

Result 1 is:
Array
(
[ liqu >] => Array
(
[ water ] => hot
[ beer ] => warm
[ milk ] => wet
)
)

Result 2 is:
Array
(
[ liqu >] => Array
(
[ water ] => Array
(
[ 0 ] => cold
[ 1 ] => fizzy
[ 2 ] => clean
)

[ milk ] => wet
[ beer ] => warm
)
)
paska at kios dot sk
04-Mar-2004 01:18

This emulates replace of $_REQUEST according to variable_order=GPC.

function array_merge_replace ( $array , $newValues ) <
foreach ( $newValues as $k ey => $v alue ) <
if ( is_array ( $v alue )) <
if ( !isset ( $array [ $k ey ] )) <
$array [ $k ey ] = array ();
>
$array [ $k ey ] = array_merge_replace ( $array [ $k ey ] , $v alue );
> else <
$array [ $k ey ] = $v alue ;
>
>
return $array ;
>

$_REQUEST = array_merge_replace ( $_REQUEST , $_GET );
$_REQUEST = array_merge_replace ( $_REQUEST , $_POST );
$_REQUEST = array_merge_replace ( $_REQUEST , $_COOKIE );
?>

Useful with stripping backslashes at beginning of main include file:

if ( get_magic_quotes_gpc () == 1 ) <

function stripMagicSlashes ( $element ) <
if ( is_array ( $element )) <
return array_map ( «stripMagicSlashes» , $element );
> else <
return stripslashes ( $element );
>
>

function array_merge_replace ( $array , $newValues ) <
foreach ( $newValues as $k ey => $v alue ) <
if ( is_array ( $v alue )) <
if ( !isset ( $array [ $k ey ] )) <
$array [ $k ey ] = array ();
>
$array [ $k ey ] = array_merge_replace ( $array [ $k ey ] , $v alue );
> else <
$array [ $k ey ] = $v alue ;
>
>
return $array ;
>

$_GET = array_map ( «stripMagicSlashes» , $_GET );
$_POST = array_map ( «stripMagicSlashes» , $_POST );
$_COOKIE = array_map ( «stripMagicSlashes» , $_COOKIE );

$_REQUEST = array_merge_replace ( $_REQUEST , $_GET );
$_REQUEST = array_merge_replace ( $_REQUEST , $_POST );
$_REQUEST = array_merge_replace ( $_REQUEST , $_COOKIE );

$GLOBALS [ ‘stripped’ ] = true;
?>

Based on examples from users from this site.
t dot tom at succont dot de
09-Jan-2004 07:09

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.
Original Array will not be touched.

Hope it helps anyone. Most thanks goes to shemari ;o)

/**
* Merges two arrays and replace existing Entrys
*
* Merges two Array like the PHP Function array_merge_recursive.
* The main difference is that existing Keys will be replaced with new Values,
* not combined in a new Sub Array.
*
* Usage:
* $newArray = array_merge_replace( $array , $newValues );
*
* @access puplic
* @author Tobias Tom
* @param array $array First Array with ‘replaceable’ Values
* @param array $newValues Array which will be merged into first one
* @return array Resulting Array from replacing Process
*/
function array_merge_replace ( $array , $newValues ) <
foreach ( $newValues as $k ey => $v alue ) <
if ( is_array ( $v alue ) ) <
if ( !isset ( $array [ $k ey ] ) ) <
$array [ $k ey ] = array ();
>
$array [ $k ey ] = $t his -> array_merge_replace ( $array [ $k ey ] , $v alue );
> else <
if ( isset ( $array [ $k ey ] ) && is_array ( $array [ $k ey ] ) ) <
$array [ $k ey ] [ 0 ] = $v alue ;
> else <
if ( isset ( $array ) && ! is_array ( $array ) ) <
$t emp = $array ;
$array = array ();
$array [ 0 ] = $t emp ;
>
$array [ $k ey ] = $v alue ;
>
>
>
return $array ;
>
?>

shemari75 at mixmail dot com
19-Dec-2003 08:22

Here’s a function to recursively merge any number of any-dimensional arrays.
It actually works in quite a similar way as array_merge_recursive does, but with two major differences:
— Later elements overwrite previous ones having the same keys.
— Numeric keys are not appended. Instead, they are converted into associative ones, and therefore overwritten as stated above.

Usage:
array array_merge_n( array array1, array array2 [ , array . ] )

/**
* Merges two arrays of any dimension
*
* This is the process’ core!
* Here each array is merged with the current resulting one
*
* @access private
* @author Chema Barcala Calveiro
* @param array $array Resulting array — passed by reference
* @param array $array _i Array to be merged — passed by reference
*/

/**
* Merges any number of arrays of any dimension
*
* The arrays to be merged are passed as arguments to the function,
* which uses an external function (array_merge_2) to merge each of them
* with the resulting one as it’s being constructed
*
* @access public
* @author Chema Barcala Calveiro
* @return array Resulting array , once all have been merged
*/

function array_merge_n () <
// Initialization of the resulting array :
$array = array ();

// Arrays to be merged (function’s arguments):
$array s =& func_get_args ();

// Merging of each array with the resulting one:
foreach ( $array s as $array _i ) <
if ( is_array ( $array _i )) <
array_merge_2 ( $array , $array _i );
>
>

Функция PHP array_merge_recursive ()

примеров


Два массива в один массив:

Определение и использование

Функция array_merge_recursive () используется для одного или более массивов в один массив.

Эта функция array_merge () между различными функциями в процессе двух или более элементов массива имеют одинаковое положение ключей. array_merge_recursive () не будет покрывать имя ключа, но несколько значений с одинаковым именем ключа рекурсивно, состоящий из массива.

Примечание: Если вы только функции () , чтобы ввести массив array_merge_recursive, результаты и array_merge () та же, функция возвращает новый массив с целыми ключами, ключи 0 , чтобы начать повторное индексирование.

PHP — неожиданный вывод array_merge_recursive ()

У меня есть этот код

Из того, что я понял для array_merge_recursive (), я ожидаю, что результаты будут

Вместо этого я получаю это

Откуда взялся индекс 22 ? Почему это выводит по-другому? Я неправильно использовал функцию?

array_merge_recursive объединяет элементы / массивы с той же глубины, что и первый массив, но если оба массива имеют ключ, это числовой индекс, и они совпадают, а затем добавляются к нему. Это то, что происходит в вашей ситуации. с тех пор ваш массив добавляется на 2-й уровень, где индекс 21 находится путем создания индекса 22 . Чтобы получить желаемый результат, вы должны изменить свой индекс 21 на строковый ключ, такой как «x21»

Заметки из php руководства

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

Почему array_merge_recursive не рекурсивные?

November 2020

229 раз

Недавно я нашел ошибку в моем приложении , вызванного неожиданным поведением array_merge_recursive . Давайте посмотрим на этот простой пример:

Я ожидал, чтобы получить массив с 3-х элементов: кнопки 1, 2 и 3. Тем не менее, функция возвращает массив с ключами 0, 1, 2 и 3 SО 4 элементов, в то время как я ожидал только 3. Когда я заменить номера их алфавитных эквивалентов (а, б, в) она возвращает массив с только 3 элементов: а, б и в.

Это (для меня по крайней мере) неожиданного поведения, но, по крайней мере, это документально:

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

Документация не очень понятно , о каких «прилагаемыми» средствами. Оказывается , что элементы $array1 с цифровой клавишей будет рассматриваться в качестве индексных элементов, поэтому они теряют там текущий ключ: возвращаемый массив начинается с 0. Это приведет к странному результату при использовании обоих числовых и строковых ключей в массиве, но давайте не будет винить PHP , если вы используете плохую практику , как это. В моем случае проблема была решена за счет использования array_replace_recursive вместо, который сделал ожидаемый трюк. ( «заменить» в том , что функция означает заменить , если есть, добавить в противном случае, называя функции трудно!)

Вопрос 1: рекурсивный или нет?

Но это не заканчивается этот вопрос. Я думал , что array_*_resursive будет рекурсивной функцией:

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

Оказывается, это не так . В то время как $array1 и $array2 ассоциативные массивы, как $array1[‘c’] и $array2[‘c’] из приведенного выше примера индексированные массивы с одним элементом: [1 => 500] . Давайте объединять их:

Ожидается , что это выход, потому что оба массива имеют цифровую клавишу ( 1 ), так что второй будет добавлен к первому. Новый массив начинается с ключом 0. Но давайте вернемся к самому первому примеру:

$array2[‘c’][1] добавляются , $array1[‘c’] но у него есть ключи 1 и 2. Не 0 и 1 в предыдущем примере. Основной массив и это суб-массивы обрабатываются по- разному при обработке целочисленных ключей.

Вопрос 2: String или целочисленный ключ имеет большое значение.

Во время написания этого вопроса, я нашел что-то еще. Это становится все более запутанным, когда замена цифрового ключа с ключом строки в подрешетке:

Таким образом , с помощью ключа строки будет отбрасывать (int) 500 в array(500) , при использовании целочисленного ключа не будет.

Может кто-нибудь объяснить такое поведение?

Что такое код array_merge_recursive

array_merge_recursive — рекурсивно объединяет два или более массивов.

Описание

array array_merge_recursive (array array1, array array2 [, array . ])

array_merge_recursive() объединяет элементы двух или более массивов так, что значения одного массива присоединяются в конец предыдущего. Возвращает результирующий массив.

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

Илон Маск рекомендует:  Firefox Marketplace
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL