使用转换按对象属性对象对象

时间:2015-09-23 14:36:32

标签: php object

我有一个对象数组,它有一个属性id我希望排序。此属性包含数字作为字符串。我试图将这些字符串转换为整数来对它们进行排序。

array(
    object(stdClass)#10717 (26) {
        ["id"]=>
            string(2) "12"
    },
    object(stdClass)#10718 (26) {
        ["id"]=>
            string(2) "13"
    }
    object(stdClass)#10719 (26) {
        ["id"]=>
            string(2) "8"
    }
 ...

我的代码是这样的

class Test 
{
    public static function test( $array ) {
        usort( $array, 'callBackSort')

        return $array;
    }

    function callBackSort( $a, $b ) {
        $a = $a->id;
        $a = (int)$a;
        $b = $b->id;
        $b = (int)$b;

        if ( $a == $b ) {
            return 0;
        }

        return ( $a < $b ) ? -1 : 1;
    }
}

// In another file
$array = Test::test($array);
var_dump( $array );

但是这不起作用,数组没有排序(与原始数组没有区别)。我完全不熟悉。

编辑:如果我从类中删除回调函数并将其放在与$array = Test::test($array);相同的文件中,那么它似乎可以正常工作。

1 个答案:

答案 0 :(得分:1)

我认为问题在于你的usort()函数试图调用一个名为&#34; callBackSort&#34;的非静态方法。来自静态背景。

将callBackSort函数保存在与&#34; test&#34;相同的文件(类)中方法,使它静态,公共,保护或私有,取决于你是否将在其他地方使用它,并通过将数组作为第二个参数传递给usort来调用它。

通过by,你的callBackSort函数比它需要的复杂一点。您不需要将值转换为int来进行比较。

class Test 
{
    public static function test( $array ) {

        //this will call a static method called "callBackSort" from class "Test" - equivalent to calling Test::callBackSort()
        usort( $array, array("Test", "callBackSort"));

        return $array;
    }

    public static function callBackSort( $a, $b ) {

        if ( $a->id == $b->id ) {
            return 0;
        }

        return ( $a->id < $b->id ) ? -1 : 1;
    }
}

针对类似案例,请参阅此答案: Using usort in php with a class private function