ФорумПрограммированиеPHP для идиотов → array_merge или конкантенация по русски

array_merge или конкантенация по русски

  • kryptamine

    Сообщения: 38 Репутация: N Группа: Кто попало

    Spritz 18 марта 2015 г. 20:06

    Всем привет.
    В общем дело обстоит так, есть 2 массива например.

    
    array:5 [▼
      0 => array:2 [▼
        "hour" => 0,
        "ratio_today" => "29.2566"
      ]
      1 => array:2 [▼
        "hour" => 1
        "ratio_today" => "32.3725"
      ]
      2 => array:2 [▼
        "hour" => 2
        "ratio_today" => "31.1512"
      ]
      3 => array:2 [▼
        "hour" => 3
        "ratio_today" => "31.0777"
      ]
      4 => array:2 [▼
        "hour" => 4
        "ratio_today" => "31.2634"
      ]
      5 => array:2 [▼
        "hour" => 5
        "ratio_today" => "29.2683"
      ]
    

    И второй массив

    
        array:5 [▼
      0 => array:2 [▼
        "hour" => 0,
        "ratio_yesterday" => "29.2566"
      ]
      1 => array:2 [▼
        "hour" => 1
        "ratio_yesterday" => "32.3725"
      ]
      2 => array:2 [▼
        "hour" => 2
        "ratio_yesterday" => "31.1512"
      ]
      3 => array:2 [▼
        "hour" => 3
        "ratio_yesterday" => "31.0777"
      ]
      4 => array:2 [▼
        "hour" => 4
        "ratio_yesterday" => "31.2634"
      ]
      5 => array:2 [▼
        "hour" => 5
        "ratio_yesterday" => "29.2683"
      ]
    

    Ключ массива = hour.
    Как мне их лучше всего смержить по ключу.
    У array_merge есть специфическая особенность, если ключи - integer, тогда он добавляет в конец другого массива.
    На данный момент я делаю это так:

    
            #добавляем префиксы к ключам первого массива
            $data = array_combine(array_map(function($a) {
                return '_' . $a;
            }, array_keys($data)), $data);
    
            #добавляем префиксы к ключам второго массива
            $data1 = array_combine(array_map(function($a) {
                return '_' . $a;
            }, array_keys($data1)), $data1);
    
            #сливаем
            $result = array_merge($data, $data1);
    
            #удаляем префиксы
            $result = array_combine(array_map(function($a) {
                return substr($a, 1);
            }, array_keys($result)), $result);
    

    На выходе я благополучно получаю искомый массив.

    
    array:6 [▼
      0 => array:3 [▼
        "hour" => array:2 [▶]
        "ratio_today" => "29.2566"
        "ratio_yesterday" => "25.3968"
      ]
      1 => array:3 [▼
        "hour" => array:2 [▶]
        "ratio_today" => "32.3725"
        "ratio_yesterday" => "25.5435"
      ]
      2 => array:3 [▼
        "hour" => array:2 [▶]
        "ratio_today" => "31.1512"
        "ratio_yesterday" => "27.6699"
      ]
      3 => array:3 [▼
        "hour" => array:2 [▶]
        "ratio_today" => "31.0777"
        "ratio_yesterday" => "27.4510"
      ]
      4 => array:3 [▼
        "hour" => array:2 [▶]
        "ratio_today" => "25.8065"
        "ratio_yesterday" => "31.2634"
      ]
      5 => array:3 [▼
        "hour" => array:2 [▶]
        "ratio_today" => "29.2683"
        "ratio_yesterday" => "27.2727"
      ]
    

    Вопрос в том, можно ли это решить менее гуммозным способом?

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 18 марта 2015 г. 22:49, спустя 2 часа 42 минуты 36 секунд

    Ключ массива = hour. Как мне их лучше всего смержить по ключу.

    @kryptamine, приходит в голову сделать массивы реально проиндексированными по значению, которое у тебя сейчас в 'hour'. Тогда они будут мержиться естественным способом.
    вместо

    
        0 => array:2 [▼
            "hour" => 0,
            "ratio_today" => "29.2566"
          ]
    

    сделать

    
        0 => "29.2566"
    

    и т.д. и т.п.

    А вообще откуда это берется, из базы? может надо сразу в SQL "мержить"?

    ιιlllιlllι унц-унц
  • master

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

    Spritz 19 марта 2015 г. 3:06, спустя 4 часа 17 минут 28 секунд

    и вроде бы вопрос простой, и ответ на него кажется несложным, а всё равно каким-то говном от него пахнет.

    а пахнет от него неправильной работой с типами данных.
    я сначала не понимал, почему в питоне есть туплы (упорядоченные последовательности без ключей) и хеши (неупорядоченные пары ключ-значение), а упорядоченных массивов с ключами нет. а вот почему:

      0 => array:2 [▼
        "hour" => 0,
        "ratio_today" => "29.2566"
      ]
      1 => array:2 [▼
        "hour" => 1
        "ratio_today" => "32.3725"
      ]
    

    что означают ключи 0, 1? можем ли мы изменить их на другие, скажем 9, 15 ? что означают значения hour=0, 1? можем ли мы их дублировать?

      9 => array:2 [▼
        "hour" => 0,
        "ratio_today" => "29.2566"
      ]
      15 => array:2 [▼
        "hour" => 1
        "ratio_today" => "32.3725"
      ]
    

    или

      0 => array:2 [▼
        "hour" => 1,
        "ratio_today" => "29.2566"
      ]
      1 => array:2 [▼
        "hour" => 1
        "ratio_today" => "32.3725"
      ]
    

    такие массивы возможны в программе?
    потому что если да - то ответы обоих неверны, и в том и в другом случае словите баг. Причём это так называемый "тихий" баг, когда программа работает, но считает неверно.

    не всё полезно, что в swap полезло
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 19 марта 2015 г. 10:06, спустя 7 часов 16 секунд

    array_replace_recursive

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 19 марта 2015 г. 10:15, спустя 8 минут 40 секунд

    а как вы такой дамп замутили?))

    [▼ [▶]

    или это с фреймворка какого то?

    на топик - похуй, не интересно

    Сапожник без сапог
  • kryptamine

    Сообщения: 38 Репутация: N Группа: Кто попало

    Spritz 19 марта 2015 г. 14:29, спустя 4 часа 14 минут 26 секунд

    Спасибо всем за участие!
    По поводу дампа - это dd() в laravel.

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 19 марта 2015 г. 14:50, спустя 20 минут 30 секунд

    array_replace_recursive

    @vasa_c, nope!

    ιιlllιlllι унц-унц
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 19 марта 2015 г. 14:58, спустя 8 минут 30 секунд

    @artoodetoo, поре?

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 19 марта 2015 г. 19:19, спустя 4 часа 20 минут 23 секунды

    Спасибо всем за участие!
    По поводу дампа - это dd() в laravel.

    @kryptamine, спс.

    Сапожник без сапог

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