Это, пожалуй, самый старый вопрос в книге с сотнями доступных ресурсов, но до сих пор каждое решение, которое я пробовал, не решило мою проблему. Я надеюсь, что вы сможете помочь.
Я пытаюсь отобразить график, который отображает последние 31 день данных. Полученный массив выглядит следующим образом:
$data[ 0 => 'day' => 10, 'amount' => 5, 'count' => 2 1 => 'day' => 16, 'amount' => 4, 'count' => 2 2 => 'day' => 21, 'amount' => 16, 'count' => 1 3 => 'day' => 11, 'amount' => 0, 'count' => 0 4 => 'day' => 12, 'amount' => 0, 'count' => 0 ]
По существу, этот массив состоит из двух частей. Первые 3 внутренних массива – это дни, которые содержат суммы и счета, остальные 27 – неучтенные в течение нескольких дней с их суммой и количеством отсчетов, равным 0. Так, например, $data[5]
будет днем 13 и $data[21]
31-го дня . $data[22]
будет равняться 1-му дню, поднимаясь до 9 дня, таким образом, показывая последние 31 день.
Кроме того, есть упорядоченный массив дней, которые мы хотим вывести.
$days[ 0 => 'day' => 10 1 => 'day' => 11 2 => 'day' => 12 ... 30 => 'day' => 9 ]
Я попробовал следующее, но в то время как теперь $data
упорядочены, это, по сути, всего лишь реплика $days
и теряет другие значения, хранящиеся в $data
.
$data = array_uintersect($days, $data, array($this, 'compare_days')); function compare_days($order, $array) { return strcmp($order['day'], $array['day']); }
Что происходит? Как я могу сортировать $data
так, чтобы он сохранял данные и заказывал их по желанию в $days
?
Просто используйте uasort
as
uasort($data, function($a,$b) use ($days){ foreach($days as $value){ if($a['day'] == $value['day']){ return 0; break; } if($b['day'] == $value['day']){ return 1; break; } } });
демонстрация
Вы можете использовать это:
foreach ($data as $key => $row) { $days[$key] = $row['day']; $amount[$key] = $row['amount']; } array_multisort($days, SORT_ASC, $amount, SORT_ASC, $data); print_r($data);