【问题标题】:sorting an array which its values are associate array对其值为关联数组的数组进行排序
【发布时间】:2017-06-15 16:41:23
【问题描述】:

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

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

【问题讨论】:

标签: php


【解决方案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 是原始数组中的字符串,因此您可能需要将这些类型转换为整数,但请看如何进行。

【讨论】:

  • 是的,谢谢。我使用它和它的工作。该链接中的代码也可以工作。非常感谢
【解决方案2】:

函数 OP 问题:

  • 首先通过$on 从子数组(第一个foreach)收集所有值,并通过 original_array 键$k 将其绑定到$sortable_array。喜欢$list[0]['post_id']; 收藏在:$sortable_array[0]
  • 收集完所有值后,数组将按 DESC 或 ASC(参见 switch)与 asort 进行排序,从而保持 index=>value 连接。所以$sortable_array 看起来像:在[0=&gt;2,1=&gt;4,2=&gt;3,3=&gt;1] 之前[3=&gt;1,0=&gt;2,2=&gt;3,1=&gt;4] 之后
  • 所以现在对值进行了排序,并且可以在下一步中使用索引。
  • 在最后一个foreach 中生成了一个新数组。 $sortable_array 中的索引 $k 用于以新顺序从 original_array 中获取子数组。

注意:这部分if (is_array($v)) 使函数行为不可预测,因为如果$v 不是子数组,则它只需要$v,否则它将从子数组中获取数据! !

【讨论】:

    【解决方案3】:

    您可以使用以下代码:

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

    【讨论】:

      【解决方案4】:

      这可能不是从该问题中选择的最佳答案。只需提取要排序的列,然后对其进行排序即可对原始列进行排序:

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

      【讨论】:

        【解决方案5】:

        最优雅的通​​常是将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
        

        注意两个调用中的反向比较运算符,&lt;&gt;...


        这显然是:

        第一个输出,降序:

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

        【讨论】:

          【解决方案6】:

          我使用这个功能:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-08-10
            • 1970-01-01
            • 2021-10-25
            • 2012-12-17
            • 2011-07-09
            • 1970-01-01
            相关资源
            最近更新 更多