PHP (array_keys) 函数不是 return 除了 for 循环中的一些键之外的所有索引

PHP (array_keys) function not return all indexes except some keys in for loop

我正在尝试从未排序的数组中获取索引(键),但我做错了。 这是我的两个数组:

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];

我尝试了 array_keys()。下面的代码有效

$a = array_keys($unsorted,$sorted[0]);
print_r($a);
echo '<br>';

输出

Array ( [0] => 10 )

但在 for 循环中它不是。请告诉我哪里做错了

for($y=0;$y<sizeOf($sorted);$y++) {
    $final_keys = array_keys($unsorted,$sorted[$y]);
    //$final[] = $final_two[$y];
}
print_r($final_keys);

输出为

Array ( [0] => 0 [1] => 2 [2] => 5 [3] => 8 )

我期待的是

Array ( [0] => 10 [1] => 13 [2] => 3 [3] => 9 [4] => 7 [5] => 11 [6] => 12 [7] => 4 [8] => 6 [9] => 1 [10] => 0 [11] => 2 [12] => 5 [13] => 8 )

您没有保存输出: $final_keys 是一个被重新填充的常规变量。或在其大小写中重新填充的数组

$final_keys = array() ;
for($y=0;$y<sizeOf($sorted);$y++) {
$final_keys[] = array_keys($unsorted,$sorted[$y]);
//$final[] = $final_two[$y];
 }
print_r($final_keys);

您还可以将每个数组添加到 $final_keys 正确的键:

$final_keys = array() ;
for($y=0;$y<sizeOf($sorted);$y++) {
$final_keys[$y] = array_keys($unsorted,$sorted[$y]);
//$final[] = $final_two[$y];
 }
print_r($final_keys);

使用 array_search()

尝试这个简单的解决方案
$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];

foreach($sorted as $value) {
    $final_keys[] = $tempKey = array_search($value,$unsorted);
    unset($unsorted[$tempKey]);
}
print_r($final_keys);

循环$sorted,在$unsorted中找到key/value对并存储。并将$unsorted中的值(我复制的,不是为了破坏原件)设置为false,否则1总是会找到1的第一个值。

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];
$copy = $unsorted;
$output=[];

foreach ($sorted as $key => $value){
  $reference = array_search( $value , $copy );
  $output[$key] = $reference;
  $copy[$reference] = false;
  }

结果:

Array
(
    [0] => 10
    [1] => 13
    [2] => 3
    [3] => 9
    [4] => 7
    [5] => 11
    [6] => 12
    [7] => 4
    [8] => 6
    [9] => 1
    [10] => 0
    [11] => 2
    [12] => 5
    [13] => 8
)

您可以在维护索引关联的同时简单地对数组进行排序,然后获取结果数组的键:

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$temp = $unsorted; // create a copy, in case you need still need the unsorted version later on
arsort($temp); // sort values in reverse order, while keeping the keys
$keys = array_keys($temp);
var_dump($keys);

因为array_search是一个缓慢的操作,使用二次复杂度的结果。相反,您可以通过两次遍历数组来使用线性复杂度。

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];

$temp = [];
foreach($unsorted as $k=>$v) {
    $temp[$v][] = $k;
}

$res = [];
foreach($sorted as $v) {
    $res[] = array_shift($temp[$v]);
}

print_r($res);

demo