2017-01-30 95 views
0

我有一个数组,它的值是关联数组。我需要基于键对这个数组进行排序;排序其值是关联数组的数组

$list = array (
    array("post_id"=>"2","date"=>"2015","title"=>"title2"), 
    array("post_id"=>"4","date"=>"2017","title"=>"title4"), 
    array("post_id"=>"3","date"=>"2016","title"=>"title3"), 
    array("post_id"=>"1","date"=>"2014","title"=>"title1") 
); 

例如排序这个数组由POST_ID这意味着把该数组这样:

$list = array (
    array("post_id"=>"1","date"=>"2014","title"=>"title1"), 
    array("post_id"=>"2","date"=>"2015","title"=>"title2"), 
    array("post_id"=>"3","date"=>"2016","title"=>"title3"), 
    array("post_id"=>"4","date"=>"2017","title"=>"title4") 


); 

我搜索这个论坛,发现这个代码:

function array_sort($array, $on, $order=SORT_ASC){ 

$new_array = array(); 
$sortable_array = array(); 

if (count($array) > 0) { 
    foreach ($array as $k => $v) { 
     if (is_array($v)) { 
      foreach ($v as $k2 => $v2) { 
       if ($k2 == $on) { 
        $sortable_array[$k] = $v2; 
       } 
      } 
     } else { 
      $sortable_array[$k] = $v; 
     } 
    } 

    switch ($order) { 
     case SORT_ASC: 
      asort($sortable_array); 
      break; 
     case SORT_DESC: 
      arsort($sortable_array); 
      break; 
    } 

    foreach ($sortable_array as $k => $v) { 
     $new_array[$k] = $array[$k]; 
    } 
} 

return $new_array;} 

,但我不明白是什么它到底在做什么。 主题链接是: Sort PHP multi-dimensional array based on key?

+0

http://php.net/manual/en/function.usort.php也许? – GordonM

回答

1

你不按键排序,所以你找到的例子不适合你。一个简单的usort将做到这一点;

$list = array (
    array("post_id"=>"2","date"=>"2015","title"=>"title2"), 
    array("post_id"=>"4","date"=>"2017","title"=>"title4"), 
    array("post_id"=>"3","date"=>"2016","title"=>"title3"), 
    array("post_id"=>"1","date"=>"2014","title"=>"title1") 
); 

function sortPosts($a, $b) 
{ 
    if ($a['post_id'] == $b['post_id']) { 
     return 0; 
    } 
    return ($a['post_id'] < $b['post_id']) ? -1 : 1; 
} 


usort($list, "sortPosts"); 

这通过您的$lists阵列成一个函数,并比较各自己的价值观 - 你可以看到我们所比较的各['post_id']值。

由于post_id是您原始数组中的字符串,因此您可能需要将这些字符串作为整数进行类型转换,但请参阅如何执行。

+0

yeap thank you。我使用它和它的工作。该链接中的代码也在工作。谢谢很多 – xwoman2

1

最优雅的通​​常是使用usort()功能与closure相结合。

看看这个简单的例子:

<?php 

$list = [ 
    ["post_id"=>"2","date"=>"2015","title"=>"title2"], 
    ["post_id"=>"4","date"=>"2017","title"=>"title4"], 
    ["post_id"=>"3","date"=>"2016","title"=>"title3"], 
    ["post_id"=>"1","date"=>"2014","title"=>"title1"] 
]; 

usort(
    $list, 
    function($a, $b) { 
    return $a['post_id'] < $b['post_id']; 
    } 
); 
print_r($list); // First output, descending order 

usort(
    $list, 
    function($a, $b) { 
    return $a['post_id'] > $b['post_id']; 
    } 
); 
print_r($list); // Second output, ascending order 

注意反向操作相比,在两个电话,<> ...


,它的输出显然:

第一个输出,降序排列:

Array 
(
    [0] => Array 
     (
      [post_id] => 4 
      [date] => 2017 
      [title] => title4 
     ) 

    [1] => Array 
     (
      [post_id] => 3 
      [date] => 2016 
      [title] => title3 
     ) 

    [2] => Array 
     (
      [post_id] => 2 
      [date] => 2015 
      [title] => title2 
     ) 

    [3] => Array 
     (
      [post_id] => 1 
      [date] => 2014 
      [title] => title1 
     ) 

) 

第二输出,按升序排列:

Array 
(
    [0] => Array 
     (
      [post_id] => 1 
      [date] => 2014 
      [title] => title1 
     ) 

    [1] => Array 
     (
      [post_id] => 2 
      [date] => 2015 
      [title] => title2 
     ) 

    [2] => Array 
     (
      [post_id] => 3 
      [date] => 2016 
      [title] => title3 
     ) 

    [3] => Array 
     (
      [post_id] => 4 
      [date] => 2017 
      [title] => title4 
     ) 

) 
1

我用这个函数:

function aasort (&$array, $key) { 
    $sorter=array(); 
    $ret=array(); 
    reset($array); 
    foreach ($array as $ii => $va) { 
     $sorter[$ii]=$va[$key]; 
    } 
    asort($sorter); 
    foreach ($sorter as $ii => $va) { 
     $ret[$ii]=$array[$ii]; 
    } 
    $array=$ret; 
    return $array; 
} 

$list = array (
    array("post_id"=>"2","date"=>"2015","title"=>"title2"), 
    array("post_id"=>"4","date"=>"2017","title"=>"title4"), 
    array("post_id"=>"3","date"=>"2016","title"=>"title3"), 
    array("post_id"=>"1","date"=>"2014","title"=>"title1") 
); 

$outputArray = aasort($list,"post_id"); 
1

这可能不是最好的答案,从这个问题选择。只需提取列进行排序,并那种排序原文:

array_multisort(array_column($list, 'post_id'), SORT_ASC, $list); 
1

您可以使用下面的代码:

<?php 
$list = array (
    array("post_id"=>"2","date"=>"2015","title"=>"title2"), 
    array("post_id"=>"4","date"=>"2017","title"=>"title4"), 
    array("post_id"=>"3","date"=>"2016","title"=>"title3"), 
    array("post_id"=>"1","date"=>"2014","title"=>"title1") 
); 

$sorted = array_orderby($list, 'post_id', SORT_ASC); 

echo "<pre>"; 
print_r($sorted); 

function array_orderby() 
{ 
    $args = func_get_args(); 
    $data = array_shift($args); 
    foreach ($args as $n => $field) { 
     if (is_string($field)) { 
      $tmp = array(); 
      foreach ($data as $key => $row) 
       $tmp[$key] = $row[$field]; 
      $args[$n] = $tmp; 
      } 
    } 
    $args[] = &$data; 
    call_user_func_array('array_multisort', $args); 
    return array_pop($args); 
} 
?> 

这将产生以下的输出:

Array 
(
    [0] => Array 
     (
      [post_id] => 1 
      [date] => 2014 
      [title] => title1 
     ) 

    [1] => Array 
     (
      [post_id] => 2 
      [date] => 2015 
      [title] => title2 
     ) 

    [2] => Array 
     (
      [post_id] => 3 
      [date] => 2016 
      [title] => title3 
     ) 

    [3] => Array 
     (
      [post_id] => 4 
      [date] => 2017 
      [title] => title4 
     ) 

) 
1

的功能 OP问题:

  • 首先通过$on从子阵列(第一个foreach)收集所有值,并通过original_array密钥$k将其绑定到$sortable_array。像$list[0]['post_id'];收集于:$sortable_array[0];
  • 在收集完所有值之后,阵列将被排序为DESC或ASC(请参阅switch)和asort,这会保持index => value连接。所以$sortable_array看起来像:在[0=>2,1=>4,2=>3,3=>1]之前[3=>1,0=>2,2=>3,1=>4]
  • 所以现在值被排序并且索引可以用于下一步。
  • 在最后的foreach中生成一个新的数组。 $sortable_array的索引$k用于按照新顺序从original_array获取子阵列。

:这部分if (is_array($v))使得功能的行为不可预测,因为它只需在$v如果$v不是一个子阵否则它会从子阵中取数据!