Я хочу сортировать массив с помощью кнопок недели недели в порядке недели, например: понедельник, вторник, среда, четверг, пятница, суббота.
Учитывая входные данные следующим образом:
Array ( [Thursday] => 8 [Friday] => 7 [Monday] => 9 [Tuesday] => 12 [Wednesday] => 8 [Saturday] => 17 )
Я хочу получить такой результат:
Array ( [Monday] => 9 [Tuesday] => 12 [Wednesday] => 8 [thusday] => 8 [friday] => 7 [Saturday] => 17 )
Пожалуйста помоги.
Следующий код не использует никаких функций сортировки. Другими словами, в этом контексте сортировка не нужна.
<?php //Your actual array... $arr=Array ( 'Thursday' => 8, 'Friday' => 7, 'Monday' => 9, 'Tuesday' => 12, 'Wednesday' => 8, 'Saturday' => 17 ); //This is the template array.. Changing this alters the output $arr2=array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'); //A simple loop that traverses all elements of the template... foreach($arr2 as $v) { //If the value in the template exists as a key in the actual array.. (condition) if(array_key_exists($v,$arr)) { $arr4[$v]=$arr[$v]; //The value is assigned to the new array and the key of the actual array is assigned as a value to the new array } } //prints the new array print_r($arr4);
OUTPUT :
Array ( [Monday] => 9 [Tuesday] => 12 [Wednesday] => 8 [Thursday] => 8 [Friday] => 7 [Saturday] => 17 )
Используйте uksort
. Вот один из способов:
$week_order = array_flip(array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')); $data = array('Thursday' => 8, 'Friday' => 7, 'Monday' => 9, 'Tuesday' => 12, 'Wednesday' => 8, 'Saturday' => 17); uksort($data, function($a, $b) use ($week_order) { return $week_order[$a] - $week_order[$b]; }); print_r($data);
Существует несколько способов сделать это, но это довольно просто с array_merge
$d = array( 'Sunday' => '', 'Monday' => '', 'Tuesday' => '', 'Wednesday' => '', 'Thursday' => '', 'Friday' => '', 'Saturday' => '', ); $n = array ( 'Thursday' => 8, 'Friday' => 7, 'Monday' => 9, 'Tuesday' => 12, 'Wednesday' => 8, 'Saturday' => 17, ); var_dump(array_filter(array_merge($d,$n)));
array_filter
удаляет пустые значения, дающие вам следующее:
array(6) { ["Monday"]=> int(9) ["Tuesday"]=> int(12) ["Wednesday"]=> int(8) ["Thursday"]=> int(8) ["Friday"]=> int(7) ["Saturday"]=> int(17) }
Без этого у вас будет следующее:
array(7) { ["Sunday"]=> string(0) "" ["Monday"]=> int(9) ["Tuesday"]=> int(12) ["Wednesday"]=> int(8) ["Thursday"]=> int(8) ["Friday"]=> int(7) ["Saturday"]=> int(17) }
Обратите внимание на пустое значение для "Sunday"
Это также можно сделать с помощью простого цикла:
$d = array( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', ); $n = array ( 'Thursday' => 8, 'Friday' => 7, 'Monday' => 9, 'Tuesday' => 12, 'Wednesday' => 8, 'Saturday' => 17, ); $sorted = array(); foreach ($d as $k) { if (isset($n[$k])) { $sorted[$k] = $n[$k]; } } var_dump($sorted);