【问题标题】:sorting array based on child array[0] (unix) value根据子数组 [0] (unix) 值对数组进行排序
【发布时间】:2019-04-29 17:26:57
【问题描述】:

我需要一个按 Unix 时间戳值排序的数组。我尝试同时使用ksortkrsort,然后才意识到有时时间戳值可能相同(并且数组中不能有重复的键)。

这是我可能会遇到的一个示例数组:

$array = array(
    [
        "unix"      => 1556547761, // notice the two duplicate unix values
        "random"    => 4
    ],
    [
        "unix"      => 1556547761,
        "random"    => 2
    ],
    [
        "unix"      => 1556547769,
        "random"    => 5
    ],
    [
        "unix"      => 1556547765, // this should be in the 3rd position
        "random"    => 9
    ]
);

所以我要做的是根据每个子数组unix 值对它们进行排序,但是我不知道该怎么做。我尝试了无数疯狂的方法(包括所有其他 sort 函数和许多很多 for 循环)来弄清楚 - 但无济于事。

感谢所有帮助。

【问题讨论】:

    标签: php arrays json


    【解决方案1】:

    您可以使用usort 按给定函数对数组进行排序

    定义函数为:

    function cmpByUnix($a, $b) {
        return $a["unix"] - $b["unix"];
    }
    

    并用于:usort($array, "cmpByUnix");

    现场示例:3v4l

    请注意,您也可以使用 asort($array);,但这也会比较“随机”字段并保留密钥 - 如果这是您需要的,请查看 Mangesh 答案

    【讨论】:

    • 哦,聪明又干净,让我试一试
    • 很高兴你推广别人的答案!但你的答案正是我想要的!只是出于好奇,有没有办法在没有array_reverse 的情况下使用当前方法翻转这个数组?还是这样做更容易
    • 我猜你可以把函数改成$b["unix"] - $a["unix"]——注意开头的$b是DESC。如果这对您有帮助,您可以将其标记为已接受
    • 哦,很明显-我为什么没有想到呢?哈哈哈
    【解决方案2】:

    array_multisort() — 对多维或多维数组进行排序

    array_columns() — 返回输入数组中单列的值

    您可以使用array_multisort()array_column(),然后提供所需的排序顺序(SORT_ASCSORT_DESC)。

    array_multisort(array_column($array, "unix"), SORT_ASC, $array);
    

    说明:

    array_multisort() 中,数组按给定的第一个数组排序。可以看到我们使用的是array_column($array, "unix"),也就是说第二个参数是排序顺序(升序或者降序),第三个参数是原始数组。

    这是array_column($array, "unix")的结果:

    Array(
        [0] => 1556547761
        [1] => 1556547761
        [2] => 1556547765
        [3] => 1556547769
    )
    

    【讨论】:

    • 让我试一试! :)
    • 你有没有机会更好地解释一下它是如何工作的?它非常紧凑且有效,但缺乏解释。
    • @GROVER。解决方案中的解释我已经提到了,希望你能理解。
    【解决方案3】:

    此函数对数组进行排序,以使数组索引与其关联的数组元素保持相关性。这主要用于对实际元素顺序很重要的关联数组进行排序。

    注意:如果两个成员比较相等,则它们在排序数组中的相对顺序是不确定的。

    参考:https://www.php.net/manual/en/function.asort.php

    asort($array);
    
    echo "<pre>";
    print_r($array);
    echo "</pre>";
    

    它会给你输出

    Array
    (
        [1] => Array
            (
                [unix] => 1556547761
                [random] => 2
            )
    
        [0] => Array
            (
                [unix] => 1556547761
                [random] => 4
            )
    
        [3] => Array
            (
                [unix] => 1556547765
                [random] => 9
            )
    
        [2] => Array
            (
                [unix] => 1556547769
                [random] => 5
            )
    
    )
    

    您可以保持数组键 [1],[0],[3],[2]) 原样,也可以根据您的要求保持顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 2011-12-15
      • 1970-01-01
      • 2016-12-31
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多