首页 > 解决方案 > php按非数字值排序多维数组,然后按数字

问题描述

我得到以下数组:

 ["person41"]=>
array(2) {
  ["original"]=>
  string(29) "photo_1.jpg"
  ["confidence"]=>
  float(0.99999)
}
["person42"]=>
array(2) {
  ["original"]=>
  string(30) "original_photo_not_defined.jpg"
  ["confidence"]=>
  float(0.99998)
}
["person33"]=>
array(2) {
  ["original"]=>
  string(29) "photo_2018.jpg"
  ["confidence"]=>
  float(0.99998)
}
["person43"]=>
array(2) {
  ["original"]=>
  string(30) "original_photo_not_defined.jpg"
  ["confidence"]=>
  float(0.9995)
}
["person44"]=>
array(2) {
  ["original"]=>
  string(30) "original_photo_not_defined.jpg"
  ["confidence"]=>
  float(0.9996)
}

我需要对它进行排序(应保留键):第一个 - 显示具有定义的原始照片的元素(original不等于original_photo_not_defined.jpg),第二个 - 所有那些original_photo_not_defined.jpg应该confidence首先从 0.99999 开始排序。所以最终的数组应该如下所示:

["person41"]=>
array(2) {
  ["original"]=>
  string(29) "photo_1.jpg"
  ["confidence"]=>
  float(0.99999)
}
["person33"]=>
array(2) {
  ["original"]=>
  string(29) "photo_2018.jpg"
  ["confidence"]=>
  float(0.99998)
}
["person42"]=>
array(2) {
  ["original"]=>
  string(30) "original_photo_not_defined.jpg"
  ["confidence"]=>
  float(0.99998)
}
["person44"]=>
array(2) {
  ["original"]=>
  string(30) "original_photo_not_defined.jpg"
  ["confidence"]=>
  float(0.9996)
}
["person43"]=>
array(2) {
  ["original"]=>
  string(30) "original_photo_not_defined.jpg"
  ["confidence"]=>
  float(0.9995)
}

我试过这个解决方案:

function cmp(array $a, array $b) {
    if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
        return $cmp;
    } else {
        return $a['baz'] - $b['baz'];
    }
}

但我不确定original_photo_not_defined.jpg应该将元素放在哪里以及如何排序confidence?欢迎任何想法,谢谢。

标签: phparrays

解决方案


比较功能可能有点挑战性:

uasort($data, function (array $a, array $b) {
    if (array_key_exists('name', $a) && $a['name'] != 'not_valid.png') {
        if (array_key_exists('name', $b) && $b['name'] != 'not_valid.png') {
            if ($a['confidence'] == $b['confidence']) {
                return 0;
            }

            return $a['confidence'] > $b['confidence'] ? -1 : 1;
        }
        return -1;
    } else if (array_key_exists('name', $b) && $b['name'] != 'not_valid.png') {
        return 1;
    }

    if ($a['confidence'] == $b['confidence']) {
        return 0;
    }

    return $a['confidence'] > $b['confidence'] ? -1 : 1;
});

基本上,您必须返回 1、0、-1,具体取决于一个在另一个之前还是在另一个之后,或者两者都在同一级别上。与uasort您一起排序并保留数组键(在您的情况下为“personXX”)。

然后该函数检查两者是否具有请求的键和值。如果是这样,我们必须比较他们的信心。如果其中一个没有,我们已经可以决定它们是更高/更低。如果双方都没有钥匙,我们要再次比较他们的信心。您可能需要调整或修正错误,但通常这应该为您指明正确的方向。

见:https ://3v4l.org/3Hnbb


推荐阅读