【问题标题】:PHP sort merged array by id from 1st array then 2nd array and repeatPHP按id从第一个数组然后第二个数组排序合并数组并重复
【发布时间】:2014-03-19 13:45:17
【问题描述】:

我有以下两个数组:

数组1

[0] => Array
    (
        [date] => 2014-02-01
        [course_id] => 1
        [id] => 24     [reg] => 1

    )

[1] => Array
    (
        [date] => 2014-02-01
        [course_id] => 2
        [id] => 25
   [reg] => 2

    )

数组2

[0] => Array
    (
        [date] => 2014-02-01
        [course_id] => 1
        [id] => 24
    )

[1] => Array
    (
        [date] => 2014-02-01
        [course_id] => 1
        [id] => 24

    )

[2] => Array
    (
        [date] => 2014-02-01
        [course_id] => 2
        [id] => 25

    )

[3] => Array
    (
        [date] => 2014-02-01
        [course_id] => 2
        [id] => 25
    )

我已经使用 array_merge 合并了这两个数组,新数组是 array3

我使用以下函数对 array3 进行了排序:

function cmp($a, $b) {
    return strnatcasecmp( $a[course_id], $b[course_id] );
}
usort($array3, "cmp");

但是,我希望得到的结果并没有像我想要的那样显示在下面,其中数组 1 中的 course_id=1 始终位于顶部,然后是数组 2 中匹配的 Course_id 列表,然后是数组中的 course_id = 2 1,后跟数组 2 中匹配的 Course_id 列表。:

[0] => Array
    (
        [date] => 2014-02-01
        [course_id] => 1
        [id] => 24
   [reg] => 1
    )

[1] => Array
    (
        [date] => 2014-02-01
        [course_id] => 1
        [id] => 24

    )

[2] => Array
    (
        [date] => 2014-02-01
        [course_id] => 1
        [id] => 24

    )

[3] => Array
    (
        [date] => 2014-02-01
        [course_id] => 2
        [id] => 25
   [reg] => 2
    )
[4] => Array
    (
        [date] => 2014-02-01
        [course_id] => 2
        [id] => 25

    )

[5] => Array
    (
        [date] => 2014-02-01
        [course_id] => 2
        [id] => 25

    )

我用来对数组 3 进行排序的函数并不总是提供所需的结果。请您帮忙解答一下这个问题。

【问题讨论】:

  • 手册引用 (php.net/manual/en/function.usort.php):The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.

标签: php arrays sorting


【解决方案1】:

将第一个数组中的 id 附加到 a 和第二个数组中的 b 并在找到相同 id 时对合并后的数组进行排序时,使用最后的区分字符来确定原始数组。 在对合并后的数组进行排序时,按 intval(id) 对其进行排序。

PS:这只是区分两个数组的一种方法。您还可以在数组中添加另一个元素来标识原始数组。

另一种可能的方法是先对数组进行单独排序,然后将它们合并。这会更快,但需要比第一种方法更多的编码。

【讨论】:

  • 嗨,感谢您的建议,但我仍然一无所知,因为我无法获得所需的输出。我已将 strnatcasecmp 更改为 intval 但这没有任何区别,我不确定如何执行您建议的这部分,“当您找到相同的 id 时,最后使用区分字符来确定原始数组。”。你能提供一个例子吗?我一直在研究所有不同的可能性,但有些东西超出了我的掌握。
  • @user3437807 因此,当您获得具有相同 intval(id) 的两个元素时,然后获取 id 的最后一个字符并进行比较,并基于该将元素放在合并数组中。如果您需要代码方面的帮助,请回复评论。
【解决方案2】:

我通过以下链接中的内容丰富的指南设法找到了答案:

http://agichevski.com/2013/06/02/sorting-a-php-multidimensional-array-by-value/

foreach ($data as $val)
 $tmp_age[] = $val['age'];

foreach ($data as $val)
 $tmp_name[] = $val['name'];

array_multisort($tmp_age, SORT_DESC, $tmp_name, $data);

我根据自己的数据对其进行了调整,它产生了我想要的结果。

希望这可以帮助其他有类似情况的人。

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 2012-03-31
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多