按工作日顺序对工作日键进行排序

时间:2014-02-12 04:26:54

标签: php arrays sorting

我想按星期顺序对工作日键进行排序,如下所示:周一,周二,周三,周四,周五,周六。

给出这样的输入:

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
)

请帮助。

3 个答案:

答案 0 :(得分:7)

以下代码不使用任何排序函数。换句话说..在此上下文中不需要排序。

<?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
)

答案 1 :(得分:5)

使用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);

答案 2 :(得分:1)

有很多方法可以做到这一点,但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)
}

请注意“星期日”的空值

也可以通过简单的循环完成:

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