获取相同的ID并从一个对象PHP数组对象返回较高的ID

时间:2018-04-04 04:55:26

标签: php arrays object

我有一个像这样的数组对象:

[
    {'id' : 1, 'school' : 'Harvard', 'score' : 90},
    {'id' : 2, 'school' : 'LA University', 'score' : 50},
    {'id' : 4, 'school' : 'Cairo', 'score' : 90},
    {'id' : 3, 'school' : 'Monster University', 'score' : 70},
    {'id' : 4, 'school' : 'Cairo', 'score' : 30},
    {'id' : 1, 'school' : 'Harvard', 'score' : 80},
]

我的预期结果如下:

[
    {'id' : 1, 'school' : 'Harvard', 'score' : 90},
    {'id' : 2, 'school' : 'LA University', 'score' : 50},
    {'id' : 3, 'school' : 'Monster University', 'score' : 70},
    {'id' : 4, 'school' : 'Cairo', 'score' : 90},
]

我尝试了一些功能,例如array_uniquearray_intersect,但结果与我的预期不同

因此,当记录有多个记录

时,我的目的是从同一记录中获得更高的分数 希望你们能帮助我

感谢

3 个答案:

答案 0 :(得分:1)

您可以使用Lodash

轻松完成此操作

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script type="text/javascript">
var data = [
  { 'id': 1, 'school': 'Harvard', 'score': 90 },
  { 'id': 2, 'school': 'LA University', 'score': 50 },
  { 'id': 4, 'school': 'Cairo', 'score': 90 },
  { 'id': 3, 'school': 'Monster University', 'score': 70 },
  { 'id': 4, 'school': 'Cairo', 'score': 30 },
  { 'id': 1, 'school': 'Harvard', 'score': 80 },
]

var result = _(data)
  .orderBy(['id', 'school'], ['asc', 'desc'])
  .uniqBy('id')
  .value();

console.log(result);
</script>

答案 1 :(得分:1)

可能有更好的方法,但这适用于您的示例数据集。我通过“TUTORIALS AND TRAINING”的Youtube教程在回调功能上改编了这个。 https://www.youtube.com/watch?v=6jrZhkphCng

这个usort()方法也在@Sameera引用的链接中进行了演示。

usort($array, function($a, $b){

  if([$a['id'], $a['score']] < [$b['id'], $b['score']]){

    return -1;

  }elseif([$a['id'], $a['score']] > [$b['id'], $b['score']]){

      return 1;

    } else {

      return 0;

     }

});


for($i = 0; $i < count($array); $i++){

  if($array[$i]['id'] != $array[$i+1]['id']){

  $results[$i]['id']      = $array[$i]['id'];
  $results[$i]['school']  = $array[$i]['school'];

  }
}

array_reverse($results);

json_encode($results);  //<--This will output a json encoded string.

这将输出如下数组:

     Array
(
    [1] => Array
        (
            [id] => 1
            [school] => Harvard
        )

    [2] => Array
        (
            [id] => 2
            [school] => LA University
        )

    [3] => Array
        (
            [id] => 3
            [school] => Monster University
        )

    [5] => Array
        (
            [id] => 4
            [school] => Cairo
        )

)

或者如果你使用json_encode()一个像这样的json编码字符串:

{"1":{"id":1,"school":"Harvard"},"2":{"id":2,"school":"LA University"},"3":{"id":3,"school":"Monster University"},"5":{"id":4,"school":"Cairo"}}

答案 2 :(得分:0)

$data = 'Your array of objects';

usort($data, function($a, $b)
{
if($a->id == $b->id)
    return $b->score - $a->score;
return strcmp($a->id, $b->id);
});

$known = array();
$finalData = array_filter($data, function ($val) use (&$known) {
$unique = !in_array($val->id, $known);
$known[] = $val->id;
return $unique;
});

print_r($finalData); // your desired array