如何通过每个元素中对象内的值对PHP对象数组进行排序?

时间:2013-10-08 16:48:38

标签: php arrays sorting

这是数组的简化版本。很容易通过'id'或'created_by'对它进行排序,但是我很难弄清楚如何通过'elements'中的“e5e53240-1d5a-4b50-ad7d-cfa00f33badd”的值来对其进行排序宾语。我花了几个小时搜索其他问题试图解决这个问题,但没有运气。

所以这是通过print_r的数组的简化版本:

[0] => stdClass Object
    (
        [id] => 12
        [created_by] => 776
        [searchable] => 1
        [elements] =>  {
"b2c4ecaa-f68f-4a5c-a551-339aa8f01421":  {

},


"e5e53240-1d5a-4b50-ad7d-cfa00f33badd":  {
    "0":  {
        "value": "Aeronca"
    }
},

"d7c903a8-fa15-4620-9d9b-2238cb48fd5c":  {
    "0":  {
        "value": "L-3B"
    }
}

    )

[1] => stdClass Object
    (
        [id] => 21
        [created_by] => 776
        [searchable] => 1
        [elements] =>  {
"b2c4ecaa-f68f-4a5c-a551-339aa8f01421":  {

},


"e5e53240-1d5a-4b50-ad7d-cfa00f33badd":  {
    "0":  {
        "value": "BEECHCRAFT"
    }
},

"d7c903a8-fa15-4620-9d9b-2238cb48fd5c":  {
    "0":  {
        "value": "N-35"
    }
}

    )

[2] => stdClass Object
    (
        [id] => 13
        [created_by] => 776
        [searchable] => 1
        [elements] =>  {
"b2c4ecaa-f68f-4a5c-a551-339aa8f01421":  {

},

"e5e53240-1d5a-4b50-ad7d-cfa00f33badd":  {
    "0":  {
        "value": "AEROSPORT"
    }
},

"d7c903a8-fa15-4620-9d9b-2238cb48fd5c":  {
    "0":  {
        "value": ""
    }
}

    )

所以基本上数组在排序时应该让第一个元素在现在的位置,然后是第三个元素,接着是第二个元素,所以它看起来像这样:

[0] => stdClass Object
    (
        [id] => 12
        [created_by] => 776
        [searchable] => 1
        [elements] =>  {
"b2c4ecaa-f68f-4a5c-a551-339aa8f01421":  {

},


"e5e53240-1d5a-4b50-ad7d-cfa00f33badd":  {
    "0":  {
        "value": "Aeronca"
    }
},

"d7c903a8-fa15-4620-9d9b-2238cb48fd5c":  {
    "0":  {
        "value": "L-3B"
    }
}

    )

[1] => stdClass Object
    (
        [id] => 13
        [created_by] => 776
        [searchable] => 1
        [elements] =>  {
"b2c4ecaa-f68f-4a5c-a551-339aa8f01421":  {

},

"e5e53240-1d5a-4b50-ad7d-cfa00f33badd":  {
    "0":  {
        "value": "AEROSPORT"
    }
},

"d7c903a8-fa15-4620-9d9b-2238cb48fd5c":  {
    "0":  {
        "value": ""
    }
}

    )

[2] => stdClass Object
    (
        [id] => 21
        [created_by] => 776
        [searchable] => 1
        [elements] =>  {
"b2c4ecaa-f68f-4a5c-a551-339aa8f01421":  {

},


"e5e53240-1d5a-4b50-ad7d-cfa00f33badd":  {
    "0":  {
        "value": "BEECHCRAFT"
    }
},

"d7c903a8-fa15-4620-9d9b-2238cb48fd5c":  {
    "0":  {
        "value": "N-35"
    }
}

    )

请记住,实际的数组要复杂得多,并且在数组中包含接近1,000个元素,所以希望我使用的任何方法都可以最大限度地减少服务器上的负载。

2 个答案:

答案 0 :(得分:0)

您想要创建自己的比较器功能并使用usort进行排序。

例如:

function myComparator($a, $b) {
    return  $a->someValue - $b->someValue;
}

php.net中解释的返回值:

  

比较函数必须返回小于,等于或的整数   如果第一个参数被认为是大于零   分别小于,等于或大于第二个。

在代码中您要对数组进行排序的位置:

usort($arrayOfObjects, 'myComparator');

答案 1 :(得分:0)

像这样解码json并创建一个关键数组。然后使用键数组和array_multisort()按您想要的顺序排序:

foreach($object as $k => $o) {
    //PHP 5.4.0
    //$key[$k] = json_decode($o->elements, true)['e5e53240-1d5a-4b50-ad7d-cfa00f33badd'][0]['value'];
    $elements = json_decode($o->elements, true);
    $key[$k]  = $elements['e5e53240-1d5a-4b50-ad7d-cfa00f33badd'][0]['value'];
}