2011-05-06 70 views
5

我想我可能已经阅读StackOverflow上每usort的文章,但我不能工作了这一个。这可能是usort不是我需要的工具吗?这里有一个位是我的工作数组(我把它分配给$allPages):我应该如何使用usort按键排序该数组?

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 - 作为,例如,在this answer on a usort question - 我只是得到了一个空白。例如:

function cmp($a, $b) { 
    return strcmp($a["slug"], $b["slug"]); 
} 
usort($allPages, 'cmp') 

print_r没有给我什么。这是与PHP 5.2.n,而不是5.3 btw。

指导,好吗?谢谢你!

+0

你是什么created_on值的意思。 – SIFE 2011-05-06 18:46:53

回答

4

你的数组中的项目是对象,而不是关联数组,所以你需要参考他们这样的:

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

PHP使用箭头,而不是句点。但这个想法是一样的。 – Tesserex 2011-05-06 18:48:20

+0

哈哈,对不起,我每天都在使用PHP和Ruby,有时会在我切换得太快时混淆它们。固定。 – Kelly 2011-05-06 18:49:31

+0

破解它!排序“doh!”我的时刻。非常感谢! – 2011-05-06 20:27:37

3

你的阵列的转储说,该元素是页面对象,不是数组。偶然的,你是否需要说$a->created_on而不是$a['created_on']?使用对象表示法而不是数组表示法。

只是猜测......

+0

是的,谢谢您推荐凯利的代码。当我能够回到这个时候,它就被修复了。 :) – 2011-05-06 20:28:35

1

由于@Tesserex建议,你需要使用对象符号,而不是数组符号。

如果你有注意事项开启时,你会得到关于访问对象作为一个数组的错误消息。

另一个要考虑的是,你的页面并不都具有“created_on”属性,一些具有“published_on”属性。您必须在您的usort方法内部执行一些错误检查/逻辑,以确保您要排序的密钥可用,并在不存在时执行某些操作。

+0

感谢您提供错误消息的提示。在这个代码的环境中,打开错误报告是一件很痛苦的事情,但我应该煞费苦心。很好地抓住了不同的日期属性:事实上,它们都有。这只是我的错误,在修改这里呈现的对象。 – 2011-05-06 20:29:49

+0

'error_reporting(E_ALL);'和'ini_set('display_errors','on');'应该在大多数情况下工作。不是真正知名的方法\: – 2011-05-06 20:31:31