【问题标题】:How to sort PHP array of objects by a value inside an object in each element?如何按每个元素中对象内的值对 PHP 对象数组进行排序?
【发布时间】:2013-10-08 16:48:38
【问题描述】:

这是数组的简化版本。很容易通过“id”或“created_by”对其进行排序,但我很难弄清楚如何通过“元素”内的“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 个元素,因此希望我使用的任何方法都能最大限度地减少服务器上的负载。

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    这样的东西来解码 json 并创建一个键数组。然后使用 key array 和 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'];
    }
    

    【讨论】:

      【解决方案2】:

      您想创建自己的比较器函数并使用usort 进行排序。

      例如:

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

      php.net中解释的返回值:

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

      在你的代码中你想要对数组进行排序的地方:

      usort($arrayOfObjects, 'myComparator');
      

      【讨论】:

      • 我根据你的回答做了以下事情,它就像一个魅力:function myComparator($a, $b) { $json_var = json_decode($a->elements, true); $first = $json_var['e5e53240-1d5a-4b50-ad7d-cfa00f33badd'][0]['value']; $json_var = json_decode($b->elements, true); $second = $json_var['e5e53240-1d5a-4b50-ad7d-cfa00f33badd'][0]['value'];返回 strcmp ( $first , $second ); } usort($arrayOfObjects, 'myComparator');
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多