подкажите, как надо поступить если у нас есть два массива и нам надо просто обновить старый новым , если там эти поля есть array_merge и Union затирают поля если их нет в новом массиве what_i_want - пример того что хочется получить как поступить то? что не так PHP: $old = array( 'userId' =>111, 'advertiser' => array( 'agencyId' => 111, 'name' => 111, 'contactAddress' => 1111) ); $new = array( 'userId' =>222, 'advertiser' => array( 'agencyId' => 222, 'contactAddress' => 222) ); $what_i_want = array( 'userId' =>222, 'advertiser' => array( 'agencyId' => 222, 'name' => 111, 'contactAddress' => 222) ); $result = $new + $old; print_r($result); echo '<br />===<br />'; $result = array_merge($old, $new); print_r($result); echo '<br />===<br />';
ни union ни array_merge не работают рекурсивно. Поэтому подобную функцию или придется написать самостоятельно. Или воспользоваться array-merge-recursive
а при чем тут рекурсивно? проблема то в принципе - новое затирает старое (это то, что надо) новое убивает старое, которого нет в новом (это не надо)
вот что выдает array-merge-recursive, если кому интересно PHP: Array ( [userId] => Array ( [0] => 111 [1] => 222 ) [advertiser] => Array ( [agencyId] => Array ( [0] => 111 [1] => 222 ) [name] => 111 [contactAddress] => Array ( [0] => 1111 [1] => 222 ) ) )
Ты съел мне мозг. Как можно убить то чего нет? Задача состоит из двух частей. 1. получить из нового массива только те элементы чьи ключи есть в старом. 2. смержить результат п.1. и старый массив. PHP: <?php array_merge($oldArray, array_intersect_key($newArray, $oldArray));
ты всегда так неуверен в себе что хамишь в интернете? по сути: Array ( [userId] => 222 [advertiser] => Array ( [agencyId] => 222 [contactAddress] => 222 ) ) 'name' => 111 по прежнему убивается
Бгг. Ахтунг! Лузеры лезут учить жизни... Нет, проблема не в принципе, проблема в мозгах автора топика. Ибо читать надо уметь. Поэтому свободен, гражданин Лев Засранский. Когда научишься формулировать мысли и читать то, что тебе пишут - тогда у тебя все получится. А до тех пор ты лузер, поскольку у меня все работает http://simpliest.co.cc/sample/array/merge.php
уважаемый простейший тролль из Донецка! я просто задал вопрос, ты на него ответил своим учишь жизни? по сути: это рабочий код? PHP: $result = array_merge_recursive($old, array_intersect_key($new, $old)); выдает PHP: Array ( [userId] => Array ( [0] => 111 [1] => 222 ) [advertiser] => Array ( [agencyId] => Array ( [0] => 111 [1] => 222 ) [name] => 111 [contactAddress] => Array ( [0] => 1111 [1] => 222 ) ) ) это по-вашему успех? или у успешных людей свой php от Энди Гутманса?
lev savranskiy, вместо того, чтобы срать на голову, мог бы почитать про рекурсию. Массив имеющий массив внутри - не одномерный массив. Работа с такими массивами осуществляется через рекурсию. У PHP почти нет встроенных функций работающих с массивами рекурсивно. Следовательно, надо написать свою. О чём тебе и написали в первом же ответе.
Тише, тише PHP: <?php function array_merge_recursive_distinct() { $arrays = func_get_args(); $base = array_shift($arrays); if (!is_array($base)) $base = empty($base) ? array() : array($base); foreach ($arrays as $append) { if (!is_array($append)) $append = array($append); foreach ($append as $key => $value) { if (!array_key_exists($key, $base) and!is_numeric($key)) { $base[$key] = $append[$key]; continue; } if (is_array($value) or is_array($base[$key])) { $base[$key] = array_merge_recursive_distinct($base[$key], $append[$key]); } else if (is_numeric($key)) { if (!in_array($value, $base)) $base[] = $value; } else { $base[$key] = $value; } } } return $base; } мопед не мой, но успешно им пользуюсь уже полгода. Найдено в комментах на php.net
я дико извиняюсь, а как ей воспользоваться, если она ничего на вход не приняла? lexa - есть две как минимум две функции для рекурсии http://www.php.ru/manual/function.array ... rsive.html http://www.php.ru/manual/function.array ... rsive.html я просто прошу подсказку как проще и грамотней к ней прикрутить функцию merge простейший заявил что у него все работает, кода ни строчки не показал вот отсюда и проблемы
что значит не приняла? PHP: <?php // пример использования $result = array_merge_recursive_distinct($myNestedArray1, $myNestedArray2); читай ман по func_get_args
Koc спасибо, вроде разобрался! я всегда расценивал рекурсию как что-то такое PHP: function factorial($number) { if ($number < 2) { return 1; } else { return ($number * factorial($number-1)); } } а зачем такое сложности через func_get_args, array_shift?
Не минимум, а максимум. Это все функции работающие рекурсивно. Так и есть. При рекурсии, при определённом условии (в противном случае будет бесконечный цикл) функция вызывает саму себя.