Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php将多维数组按非数值排序,然后按数值排序_Php_Arrays - Fatal编程技术网

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()
。如果遇到值排序错误的问题,这可能是原因。