|
 |
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] => blue
)
[0] => 5
[1] => 10
)
|
|
См.также array_merge().
array_merge_recursive
smilingrasta
07-Jul-2006 10:04
This function tends to reindex arrays, which is not mentioned in the function description.
I just tried to run that function on a three dimensional array, containing errormessages.
The first dim. contains the severity of the error ('warn', 'crit') the second dim the linenumber (numerical) and the third one consists of errormessages
<?php
Array
(
[warn] => Array (
[2] => Array (
[0] => "Category does not exist"
[1] => "Manufacturer does not exist"
)
)
)
?>
If i now merge two or more of those arrays using array_merge_recursive(), the linenumbers are not conserved. Instead of, they are all renumbered, starting with 0.
Just thought anyone may want to know about that. :)
regards, smilingrasta
Vladimir Kornea
11-May-2006 07:10
The documentation for array_merge_recursive() states that string keys are preserved while numeric keys are renumbered. What's not obvious is that string keys which happen to be numeric are NOT preserved, but renumbered:
$a = array('5' => array('blue'));
$b = array('5' => array('red'));
$c = array_merge_recursive($a, $b);
print_r($c);
Output:
Array
(
[0] => Array
(
[0] => blue
)
[1] => Array
(
[0] => red
)
)
If the key '5' were treated as a string, the resulting array would be this:
Array
(
[5] => Array
(
[0] => blue
[1] => red
)
)
jason at ebasterpro dot com
19-Aug-2005 09: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 08: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, $tmpArray);
...
}
fire at firepages dot com dot au
20-Dec-2004 07: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 07: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.
<pre><?php
$a1 = array('a'=>'b');
$a2 = array('a'=>'b');
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";
$a1 = array('a'=>NULL);
$a2 = array('a'=>NULL);
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";
$a1 = array('a'=>'b');
$a2 = array('a'=>NULL);
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";
?></pre>
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
25-May-2004 02:44
Here is a fairly simple function that replaces while recursing.
<?php
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:
<?php
$array1 = array(
'liquids' => array(
'water' => array('cold', 'fizzy', 'clean')
,'beer' => 'warm'
)
);
$array2 = array(
'liquids' => array(
'water' => 'hot'
,'milk' => 'wet'
)
);
$result1 = array_merge_recursive2($array1, $array2);
$result2 = array_merge_recursive2($array2, $array1);
?>
Result 1 is:
Array
(
[liquids] => Array
(
[water] => hot
[beer] => warm
[milk] => wet
)
)
Result 2 is:
Array
(
[liquids] => Array
(
[water] => Array
(
[0] => cold
[1] => fizzy
[2] => clean
)
[milk] => wet
[beer] => warm
)
)
paska at kios dot sk
04-Mar-2004 02:18
This emulates replace of $_REQUEST according to variable_order=GPC.
<?
function array_merge_replace($array, $newValues) {
foreach ($newValues as $key => $value ) {
if (is_array($value)) {
if (!isset($array[$key])) {
$array[$key] = array();
}
$array[$key] = array_merge_replace($array[$key], $value);
} else {
$array[$key] = $value;
}
}
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 $key => $value ) {
if (is_array($value)) {
if (!isset($array[$key])) {
$array[$key] = array();
}
$array[$key] = array_merge_replace($array[$key], $value);
} else {
$array[$key] = $value;
}
}
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
08-Jan-2004 08: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)
<?php
function array_merge_replace( $array, $newValues ) {
foreach ( $newValues as $key => $value ) {
if ( is_array( $value ) ) {
if ( !isset( $array[ $key ] ) ) {
$array[ $key ] = array();
}
$array[ $key ] = $this->array_merge_replace( $array[ $key ], $value );
} else {
if ( isset( $array[ $key ] ) && is_array( $array[ $key ] ) ) {
$array[ $key ][ 0 ] = $value;
} else {
if ( isset( $array ) && !is_array( $array ) ) {
$temp = $array;
$array = array();
$array[0] = $temp;
}
$array[ $key ] = $value;
}
}
}
return $array;
}
?>
shemari75 at mixmail dot com
18-Dec-2003 09: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 ...])
<?php
function array_merge_2(&$array, &$array_i) {
foreach ($array_i as $k => $v) {
if (is_array($v)) {
if (!isset($array[$k])) {
$array[$k] = array();
}
array_merge_2($array[$k], $v);
} else {
if (isset($array[$k]) && is_array($array[$k])) {
$array[$k][0] = $v;
} else {
if (isset($array) && !is_array($array)) {
$temp = $array;
$array = array();
$array[0] = $temp;
}
$array[$k] = $v;
}
}
}
}
function array_merge_n() {
$array = array();
$arrays =& func_get_args();
foreach ($arrays as $array_i) {
if (is_array($array_i)) {
array_merge_2($array, $array_i);
}
}
return $array;
}
?>
| |