PHP. Свертывание многомерных массивов по именованному ключу

У меня есть следующий массив (содержащий результаты нескольких запросов к базе данных) в примере только 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. Я знаю … предварительно вычислить значения 🙂 … теперь не вариант.

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

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

благодаря

Во-первых, я собираюсь предположить, что ваши данные отсортированы по дате, так как вы можете сделать это в 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++; } } 

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