PHP(array_keys)函数不会返回所有索引,但for循环中的某些键除外

时间:2018-10-26 10:17:33

标签: php arrays array-key

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

$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>';

输出

  

数组([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)

我期望的是

  

数组([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)

5 个答案:

答案 0 :(得分:2)

循环$sorted,在$unsorted中找到键/值对并进行存储。并将$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
)

答案 1 :(得分:2)

您可以在保持索引关联的同时对数组进行排序,然后获取结果数组的键:

$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);

答案 2 :(得分:0)

您没有保存输出: $ 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);

答案 3 :(得分:0)

尝试使用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);

答案 4 :(得分:0)

因为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