2015-08-10 4 views
4

Это самый старый вопрос в книге с сотнями доступных ресурсов, но до сих пор каждое решение, которое я пробовал, не решило мою проблему. Я надеюсь, что вы сможете помочь.Сортировка многомерного массива на основе упорядоченного массива

Я пытаюсь отобразить график, отображающий последние 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?

ответ

3

Просто используйте uasort в

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; 
     } 
    } 
}); 

Demo

+0

Это хорошо и сорта, как задумано, так что спасибо! Единственная проблема сейчас (и я не упоминал об этом в своем сообщении, так что извиняюсь), запустив 'json_encode ($ data)' возвращает '{" 5 ": {" day ":" 10 "," amount ":" 0 »,« пожертвования »:« 0 »},« 2 »: {« день »:« 11 »...', который вместо этого должен читать '[{" день ":" 10 "...}]'. Я предполагаю, что это потому, что массив теперь «неупорядочен» с точки зрения ключа индекса. Подумайте? –

+0

Извините, вы не можете получить вы можете отправить исходный массив вместе с ожидаемым выходом –

+0

Все в порядке. Я решил это с помощью echo json_encode (array_values ​​($ graph)), который, к счастью, сбрасывает индексы массивов, которые будут последовательными. Спасибо за помощь! –

0

Вы можете использовать это:

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); 
+0

Сортируется по дням по возрастанию (от 1 до 31). День действительно начинается 10 июля (10 августа - 31 день), а затем возвращается к 10 августа. –

Смежные вопросы