php将多维数组按非数值排序,然后按数值排序
我得到了以下数组:php将多维数组按非数值排序,然后按数值排序,php,arrays,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"]=> flo
["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\u photo\u NOT\u defined.jpg
),
第二-所有带有未定义的原始照片的照片。jpg
应首先按照置信度从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'];
}
}
但我不确定在何处指出未定义原始照片的元素。jpg
应放在较低的位置,然后如何按置信度排序?欢迎提出任何想法,谢谢。比较功能可能有点挑战性:
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”在您的示例中)
然后,该函数检查两者是否都具有请求的键和值。如果是这样,我们必须比较他们的信心。如果其中一个没有,我们已经可以决定它们是否较高/较低。如果双方都没有钥匙,我们必须再次比较他们的信心。您可能需要调整或修复错误,但通常这会为您指明正确的方向
请参阅:比较功能可能有点挑战性:
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”在您的示例中)
然后,该函数检查两者是否都具有请求的键和值。如果是这样,我们必须比较他们的信心。如果其中一个没有,我们已经可以决定它们是否较高/较低。如果双方都没有钥匙,我们必须再次比较他们的信心。您可能需要调整或修复错误,但通常这会为您指明正确的方向
请参阅:这是否来自数据库?如果是这样的话,你应该在查询中对它进行排序。不,这是来自第三方服务的json字符串,没有数据库“我尝试过这个解决方案:”-我想说你实际上尝试过任何东西可能有点多,因为在数据中使用键foo
和baz
,一开始就没有意义了。//上面提到的副本解释了比较函数需要做的事情:基于传递给它的两个数组元素的比较返回一个值。因此,您首先需要区分“a是原始的,b不是”,“a不是,但b是”的情况,并且只有当两者都是原始的或两者都不是原始的情况下,您才能查看每种情况的置信度。@Masha顺便说一句,当比较0.99999等浮点值时,您可能会得到舍入错误。为了防止这种情况,您可以将它们转换为字符串或使用bcmath扩展名中的bccomp()
。如果遇到值排序错误的问题,这可能是原因。这是否来自数据库?如果是这样的话,你应该在查询中对它进行排序。不,这是来自第三方服务的json字符串,没有数据库“我尝试过这个解决方案:”-我想说你实际上尝试过任何东西可能有点多,因为在数据中使用键foo
和baz
,一开始就没有意义了。//上面提到的副本解释了比较函数需要做的事情:基于传递给它的两个数组元素的比较返回一个值。因此,您首先需要区分“a是原始的,b不是”,“a不是,但b是”的情况,并且只有当两者都是原始的或两者都不是原始的情况下,您才能查看每种情况的置信度。@Masha顺便说一句,当比较0.99999等浮点值时,您可能会得到舍入错误。为了防止这种情况,您可以将它们转换为字符串或使用bcmath扩展名中的bccomp()
。如果遇到值排序错误的问题,这可能是原因。