2015-10-11 81 views
0

我有一些简单的PHP代码,用于格式化包含某些歌曲信息的对象。我尝试使用usort()对这些信息进行排序,但我无法完全正确地进行排序。PHP usort()不按预期工作

print_r($my_songs_object)返回(重简化):

stdClass Object 
(
    [0] => stdClass Object 
     (
      [track] => stdClass Object 
       (
        [name] => ZZZ 
       ) 
     ) 

    [1] => stdClass Object 
     (
      [track] => stdClass Object 
       (
        [name] => YYY 
       ) 
     ) 
) 

我的PHP排序代码:

usort($my_songs_object, function($a, $b) { 
    return ucfirst($a->track->name) > ucfirst($b->track->name) ? 1 : -1; 
}); 

运行上述usort()后,$my_songs_object总是返回数据顺序。

在上面的例子中,第1项应该来项目之前0

我怎样才能修改usort函数来实现所需的输出?

编辑:

原始对象正在创建需要被合并两个预存对象的array_merge。我使用下面的代码把它们结合在一起:

$my_songs_object = (object)array_merge((array)$a->items, (array)$b->items); 

可能修改其中的对象合并将使排序组合$ my_songs_object更简单的方法是什么?

+1

甚至可以在stdClass(而不是阵列)上工作吗? – user2864740

+1

@frosty:_“usort是一个痛苦的屁股使用”_ - 不,它是一个伟大的工具,基本上可以完成任何类型的自定义排序,你可以想到的。这是一个非常方便的事情,你只需要知道你在做什么。 – CBroe

+0

你为什么不简单地将这些东西排在物体之前? – CBroe

回答

0

答案是,事实证明,在初始合并后,我不需要将数组类型转换为对象。

更改:

$my_songs_object = (object)array_merge((array)$a->items, (array)$b->items); 

要:

$my_songs_object = array_merge((array)$a->items, (array)$b->items); 

解决的问题。感谢@Cbroe将此引入我的注意:)

我会将其标记为在两天内解决。