За последние 24 часа нас посетили 16889 программистов и 1646 роботов. Сейчас ищут 952 программиста ...

Array merge c сохранением данных источника

Тема в разделе "Прочие вопросы по PHP", создана пользователем lev savranskiy, 4 июн 2010.

  1. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    подкажите, как надо поступить если у нас есть два массива и нам надо просто обновить старый новым , если там эти поля есть

    array_merge и Union затирают поля если их нет в новом массиве
    what_i_want - пример того что хочется получить

    как поступить то? что не так

    PHP:
    1.         $old = array(
    2.        'userId' =>111,
    3.        'advertiser' => array(
    4.            'agencyId' => 111,
    5.            'name' => 111,
    6.            'contactAddress' => 1111)
    7.         );
    8.  
    9.        $new = array(
    10.        'userId' =>222,
    11.        'advertiser' => array(
    12.            'agencyId' => 222,
    13.            'contactAddress' => 222)
    14.         );
    15.  
    16.  
    17.         $what_i_want  = array(
    18.         'userId' =>222,
    19.         'advertiser' => array(
    20.             'agencyId' => 222,
    21.             'name' => 111,
    22.               'contactAddress' => 222)
    23.          );
    24.  
    25.         $result =   $new + $old;
    26.          print_r($result);
    27.          echo '<br />===<br />';
    28.  
    29.        $result = array_merge($old, $new);
    30.         print_r($result);
    31.         echo '<br />===<br />';
    32.  
    33.  
    34.  
    35.                
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    ни union ни array_merge не работают рекурсивно.
    Поэтому подобную функцию или придется написать самостоятельно.
    Или воспользоваться array-merge-recursive
     
  3. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    а при чем тут рекурсивно?

    проблема то в принципе - новое затирает старое (это то, что надо)
    новое убивает старое, которого нет в новом (это не надо)
     
  4. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    вот что выдает array-merge-recursive, если кому интересно

    PHP:
    1. Array ( [userId] => Array ( [0] => 111 [1] => 222 ) [advertiser] => Array ( [agencyId] => Array ( [0] => 111 [1] => 222 ) [name] => 111 [contactAddress] => Array ( [0] => 1111 [1] => 222 ) ) )
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Ты съел мне мозг.
    Как можно убить то чего нет?

    Задача состоит из двух частей.
    1. получить из нового массива только те элементы чьи ключи есть в старом.
    2. смержить результат п.1. и старый массив.

    PHP:
    1. <?php
    2. array_merge($oldArray, array_intersect_key($newArray, $oldArray));
    3.  
     
  6. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    ты всегда так неуверен в себе что хамишь в интернете?

    по сути:

    Array ( [userId] => 222 [advertiser] => Array ( [agencyId] => 222 [contactAddress] => 222 ) )

    'name' => 111 по прежнему убивается
     
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Бгг.
    Ахтунг! Лузеры лезут учить жизни...

    Нет, проблема не в принципе, проблема в мозгах автора топика.

    Ибо читать надо уметь.
    Поэтому свободен, гражданин Лев Засранский.

    Когда научишься формулировать мысли и читать то, что тебе пишут - тогда у тебя все получится.
    А до тех пор ты лузер, поскольку у меня все работает
    http://simpliest.co.cc/sample/array/merge.php
     
  8. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    уважаемый простейший тролль из Донецка!

    я просто задал вопрос, ты на него ответил своим

    учишь жизни?

    по сути:


    это рабочий код?

    PHP:
    1.  
    2.  
    3.  
    4. $result = array_merge_recursive($old, array_intersect_key($new, $old));
    выдает


    PHP:
    1. Array ( [userId] => Array ( [0] => 111 [1] => 222 ) [advertiser] => Array ( [agencyId] => Array ( [0] => 111 [1] => 222 ) [name] => 111 [contactAddress] => Array ( [0] => 1111 [1] => 222 ) ) )
    это по-вашему успех?

    или у успешных людей свой php от Энди Гутманса?
     
  9. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    lev savranskiy, вместо того, чтобы срать на голову, мог бы почитать про рекурсию.

    Массив имеющий массив внутри - не одномерный массив. Работа с такими массивами осуществляется через рекурсию. У PHP почти нет встроенных функций работающих с массивами рекурсивно. Следовательно, надо написать свою.

    О чём тебе и написали в первом же ответе.
     
  10. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Тише, тише
    PHP:
    1. <?php
    2. function array_merge_recursive_distinct()
    3. {
    4.     $arrays = func_get_args();
    5.     $base = array_shift($arrays);
    6.    
    7.     if (!is_array($base)) $base = empty($base) ? array() : array($base);
    8.  
    9.     foreach ($arrays as $append) {
    10.         if (!is_array($append)) $append = array($append);
    11.         foreach ($append as $key => $value) {
    12.             if (!array_key_exists($key, $base) and!is_numeric($key)) {
    13.                 $base[$key] = $append[$key];
    14.                 continue;
    15.             }
    16.             if (is_array($value) or is_array($base[$key])) {
    17.                 $base[$key] = array_merge_recursive_distinct($base[$key], $append[$key]);
    18.             } else if (is_numeric($key)) {
    19.                 if (!in_array($value, $base)) $base[] = $value;
    20.             } else {
    21.                 $base[$key] = $value;
    22.             }
    23.         }
    24.     }
    25.     return $base;
    26. }
    27.  
    мопед не мой, но успешно им пользуюсь уже полгода. Найдено в комментах на php.net
     
  11. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    я дико извиняюсь, а как ей воспользоваться, если она ничего на вход не приняла?

    lexa - есть две как минимум две функции для рекурсии

    http://www.php.ru/manual/function.array ... rsive.html
    http://www.php.ru/manual/function.array ... rsive.html

    я просто прошу подсказку как проще и грамотней к ней прикрутить функцию merge

    простейший заявил что у него все работает, кода ни строчки не показал

    вот отсюда и проблемы
     
  12. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    что значит не приняла?
    PHP:
    1. <?php
    2. // пример использования
    3. $result = array_merge_recursive_distinct($myNestedArray1, $myNestedArray2);
    читай ман по func_get_args
     
  13. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    Koc
    спасибо, вроде разобрался!

    я всегда расценивал рекурсию как что-то такое

    PHP:
    1.  
    2. function factorial($number) {
    3.  
    4.     if ($number < 2) {
    5.         return 1;
    6.     } else {
    7.         return ($number * factorial($number-1));
    8.     }
    9. }  

    а зачем такое сложности через func_get_args, array_shift?
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    что бы можно было неограниченное кол-во массивов смержить
     
  15. lev savranskiy

    lev savranskiy Активный пользователь

    С нами с:
    9 дек 2009
    Сообщения:
    18
    Симпатии:
    0
    спасибо!
     
  16. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Не минимум, а максимум. :) Это все функции работающие рекурсивно.

    Так и есть. При рекурсии, при определённом условии (в противном случае будет бесконечный цикл) функция вызывает саму себя.