ФорумПрограммированиеPHP для идиотов → Сложение многомерных массивов

Сложение многомерных массивов

  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 24 января 2009 г. 11:47

    Есть два массива:

    $local['string']['title'] = 'титл';
    $local['string']['etc'] = 'тест';
    $global['string']['title'] = 'титл2';
    $global['string']['content'] = 'контент';

    Нужно чтобы массив global заменял массив local. Но чтобы массив global['string'] или любые другие, находящиеся на том же уровне вложенности, не заменяли такой-же массив (string и т.д.) в массиве local полностью, а лишь дополнял его, и заменял одинаковые элементы.
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 24 января 2009 г. 11:50, спустя 3 минуты 49 секунд

    array_merge + рекурсия
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 24 января 2009 г. 11:52, спустя 1 минуту 54 секунды

    В смысле рекурсия? array_merge_recursive? Так она не подходит.
    Ладно, вроде понял.
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 24 января 2009 г. 12:15, спустя 22 минуты 55 секунд

    $array['local']['string']['title'] = 'титл';
    $array['local']['string']['etc'] = 'тест';
    $array['global']['string']['title'] = 'титл2';
    $array['global']['string']['content'] = 'контент';
    $array['global']['zzz']['content'] = 'zzz';

    foreach ($array as $namespace => $etc)
    {
    foreach ($etc as $type => $key)
    {
    if (is_array($array['local'][$type]) && is_array($array['global'][$type]))
    $result[$type] = array_merge($array['local'][$type], $array['global'][$type]);
    else if (is_array($array['local'][$type]) && !is_array($array['global'][$type]))
    $result[$type] = $array['local'][$type];
    else if (!is_array($array['local'][$type]) && is_array($array['global'][$type]))
    $result[$type] = $array['global'][$type];
    }
    }

    print_r($result);
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 24 января 2009 г. 12:22, спустя 6 минут 39 секунд

    не, в смысле именно рекурсия

    хотя, если ты не пользуешься целочисленными ключами можно и через array_merge_recursive
    например так
    <?php 
    $arr1 = array (
    'tst1' => array(
    'f1'=>5,
    'f2'=>'fff',
    'f3'=>34,
    ),
    'tst2' => array(
    'f1'=>8,
    'f2'=>'hhh',
    ),
    );
    $arr2 = array (
    'tst1' => array(
    'f1'=>4,
    'f2'=>'fddff',
    ),
    'tst3' => array(
    'f1'=>7,
    'f2'=>'hhfh',
    ),
    );
    $arr3 = array_merge_recursive($arr1, $arr2);

    function rally($arr) {
    if (!is_array($arr)) return $arr;
    $el = each($arr);
    if ($el===false) return $arr;
    if (is_int($el['key'])) {
    $curVal = $el['value'];
    foreach ($arr as $el) {
    $curVal = $el;
    }
    return $el;
    } else {
    foreach ($arr as $key=>$el) {
    $arr[$key]=rally($el);
    }
    return $arr;
    }
    }

    print_r($arr3);
    $d = array_map('rally', $arr3);
    print_r($d);

    ?>

Пожалуйста, авторизуйтесь, чтобы написать комментарий!