У меня есть следующий массив (содержащий результаты нескольких запросов к базе данных) в примере только 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 )
Что нужно учитывать:
$arr[0][1][date] != $arr[1][1][date]
$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++; } }
Теперь ваш $ объединенный массив должен иметь то, что вы хотите. Обратите внимание, что это решение предполагает, что у вас нет повторяющихся строк даты в одном фрагменте, или он будет перезаписывать существующие результаты. Кроме того, вы можете расширить, чтобы иметь более двух наборов данных, если хотите.