PHP - объединение многомерных массивов по имени ключа - PullRequest
0 голосов
/ 20 января 2011

У меня есть следующий массив (который содержит результаты нескольких запросов к базе данных - в примере только 2, но может быть больше. Объединение должно быть выполнено указанным столбцом (в этом случае столбец дата ). Давайте назовем этот столбец merge_by .

 Array
(
[0] => Array
    (
        [0] => Array
            (
                [date] => 2011-01-17
                [col-1] => 58
                [col-2] => 54
            )

        [1] => Array
            (
                [date] => 2011-01-19
                [col-1] => 50
                [col-2] => 61
            )

        [2] => Array
            (
                [date] => 2011-01-20
                [col-1] => 44
                [col-2] => 22
            )

        [3] => Array
            (
                [date] => 
                [col-1] => 448
                [col-2] => 196

    )

[1] => Array
    (
        [0] => Array
            (
                [date] => 2011-01-17
                [col-3] => 1489
            )

        [1] => Array
            (
                [date] => 2011-01-18
                [col-3] => 1534 
            )

        [2] => Array
            (
                [date] => 
                [col-3] => 1534
            )

    )

)

И я пытаюсь достичь

Array
    (
        [0] => Array
            (
                [date] => 2011-01-17
                [col-1] => 58
                [col-2] => 54
                [col-3] => 1489
            )

        [1] => Array
            (
                [date] => 2011-01-18
                [col-1] =>
                [col-2] =>
                [col-3] => 1534
            )

        [2] => Array
            (
                [date] => 2011-01-19
                [col-1] => 50
                [col-2] => 61
                [col-3] =>
            )

        [3] => Array
            (
                [date] => 2011-01-20
                [col-1] => 44
                [col-2] => 22
                [col-3] =>
            )

        [4] => Array
            (
                [date] => 
                [col-1] => 448
                [col-2] => 196
                [col-3] => 1534

    )

Что нужно учитывать:

  • merge_by может принимать нулевые или пустые строковые значения
  • merge_by не будет иметь одинаковых значений в объединяемых массивах
  • количество результатов в 2 запросах будет отличаться, а значения merge_by могут отличаться, поэтому можно встретить
    $arr[0][1][date] != $arr[1][1][date]
  • LE: кроме столбца merge_by , все остальные столбцы будут отличаться друг от друга, поэтому у вас не будет $arr[0][0][col-2] и $arr[1][0][col-2]

Таким образом, цель этого - объединить столбцы некоторых запросов в общий столбец.
Слишком много данных из слишком большого количества баз данных из слишком большого числа столбцов, чтобы сделать их только из SQL. Я знаю ... предварительно рассчитать значения :) ... сейчас не вариант.

Мне удалось заставить его работать, когда количество столбцов и индексы этих совпадают. С тех пор перепробовал много вариантов, поэтому сейчас у меня есть версия, недостойная добавления ее в качестве примера.

Так кто-нибудь имеет представление о функции, которая может достичь вышеуказанного?

Спасибо

1 Ответ

1 голос
/ 20 января 2011

Во-первых, я собираюсь предположить, что ваши данные отсортированы по дате, поскольку вы можете сделать это в SQL, и они отсортированы в вашем примере.Вам нужно пройти по всем вашим наборам одновременно, объединяясь по ходу.

$merged = array();
$i_first = 0;
$i_second = 0;

$count_first = count($data[0]);
$cound_second = count($data[1]);

while ($i_first < $count_first || $i_second < $count_second)
{
    // this comparison depends on what your merge_by is
    $diff = strtotime($data[$i_first]['date']) - strtotime($data[$i_second]['date']);

    if ($diff == 0)
    {
        $merged[] = array_merge($data[$i_first], $data[$i_second]);
        $i_first++;
        $i_second++;
    }
    elseif ($diff < 0) // first date is earlier
    {
        $i_first++;
    }
    else  // second date earlier
    {
        $i_second++;
    }
}

Теперь ваш массив $ merged должен иметь то, что вы хотите.Обратите внимание, что это решение предполагает, что у вас нет повторяющихся строк даты в одном чанке, или оно перезапишет существующие результаты.Кроме того, вы можете расширить, чтобы иметь более двух наборов данных, если хотите.

...