我该如何使用usort按键对这个数组进行排序?

5

我想我可能已经阅读了StackOverflow上的每一篇usort文章,但我无法理解其中的一个。也许usort不是我需要的工具?这是我正在使用的数组的一部分(我将其分配给$allPages):

Array
(
    [0] => Page Object
        (
            [id] => 4
            [slug] => articles
            [created_on] => 2009-08-06 07:16:00
        )

    [1] => Page Object
        (
            [id] => 99
            [slug] => a-brief-history
            [created_on] => 2011-04-25 12:07:26
        )

    [2] => Page Object
        (
            [id] => 98
            [slug] => we-arrive
            [created_on] => 2011-04-24 13:52:35
        )

    [3] => Page Object
        (
            [id] => 83
            [slug] => new-year
            [created_on] => 2011-01-02 14:05:12
        )
)

我最终的目标是按 created_on 值排序,但现在,我愿意先尝试对任何一个值进行排序!当我使用常规的 cmp($a, $b) 类型回调函数和 usort 进行排序时——例如在这个 usort 问题的回答中——结果只是空白。例如:

function cmp($a, $b) {
  return strcmp($a["slug"], $b["slug"]);
}
usort($allPages, 'cmp')
< p >使用< code >print_r没有输出任何内容。这是在PHP 5.2.n下,不是5.3。请给予指导,谢谢!< /p> < p >请提供帮助!谢谢!< /p>

"created_on value" 的意思是什么? - SIFE
3个回答

4

您的数组中的项目是对象,而不是关联数组,因此您需要像这样引用它们:

function cmp($a, $b) {
  return strcmp($a->slug, $b->slug);
}
usort($allPages, 'cmp')

PHP使用箭头而不是句点。但是思路是相同的。 - Tesserex
哈哈,抱歉,我每天都使用PHP和Ruby工作,有时候在快速切换时会混淆它们。已经修复了。 - Kelly
成功了!对我来说就像是“哦!”的瞬间。非常感谢! - Dɑvïd

3

您的数组转储显示元素是页面对象,而不是数组。是否偶然需要使用对象符号而不是数组符号,例如 $a->created_on 而不是 $a['created_on']

只是猜测...


是的,感谢您提醒凯利的代码问题。我回来时它已经被修复了。 :) - Dɑvïd

1

正如@Tesserex所建议的那样,您需要使用对象表示法而不是数组表示法。

如果您打开了通知,您将收到有关将对象作为数组访问的错误消息。

另一件要考虑的事情是,您的页面并不都具有“created_on”属性,有些具有“published_on”属性。您将不得不在usort方法内部进行一些错误检查/逻辑,以确保您想要按其排序的键可用,并在其不可用时执行某些操作。


感谢您提供错误信息。在这个代码环境中,启用错误报告是非常麻烦的,但我应该去做。另外,很高兴您发现了日期属性的差异:实际上它们都有。那只是我为了演示而对对象进行了简化。 - Dɑvïd
error_reporting(E_ALL);ini_set('display_errors', 'on'); 在大多数情况下都可以使用。它们不是很常用的方法 : - Jim Rubenstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接