php按非数字值对多维数组进行排序,然后按数字进行排序

时间:2018-10-19 11:38:02

标签: php arrays

我得到了以下数组:

 ["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)
}

我需要对其进行排序(键应保留): 1st-显示具有定义的原始照片的元素(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进行排序?任何想法都将受到欢迎,谢谢。

1 个答案:

答案 0 :(得分:2)

比较功能可能会有些挑战:

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