反向排序数组,重新排列索引

时间:2018-02-18 04:25:04

标签: php arrays sorting multidimensional-array

所以目前我遇到了像我这样的阵列设置的问题

array(8) { 
    [0]=> array(2) { 
        [0]=> float(2.1166666666667) 
        [1]=> string(7) "9434493" 
    } 
    [1]=> array(2) { 
        [0]=> float(2.07) 
        [1]=> string(7) "8591971" 
    } 
    [2]=> array(2) { 
        [0]=> float(2.0566666666667) 
        [1]=> string(8) "17015102" 
    } 
    [3]=> array(2) { 
        [0]=> float(2.0366666666667) 
        [1]=> string(7) "9637191" 
    } 
    [4]=> array(2) { 
        [0]=> float(2.015) 
        [1]=> string(8) "11405473" 
    } 
    [5]=> array(2) { 
        [0]=> float(1.9833333333333) 
        [1]=> string(8) "28233403" 
    } 
    [6]=> array(2) { 
        [0]=> float(2.0366666666667) 
        [1]=> string(8) "14248330" 
    } 
    [7]=> array(2) { 
        [0]=> float(2.0933333333333) 
        [1]=> string(8) "14987165" 
    } 
}

使用函数arsort()后,它看起来像这样:

array(8) { 
    [0]=> array(2) { 
        [0]=> float(2.1166666666667) 
        [1]=> string(7) "9434493" 
    } 
    [7]=> array(2) { 
        [0]=> float(2.0933333333333) 
        [1]=> string(8) "14987165" 
    } 
    [1]=> array(2) { 
        [0]=> float(2.07) 
        [1]=> string(7) "8591971" 
    } 
    [2]=> array(2) { 
        [0]=> float(2.0566666666667) 
        [1]=> string(8) "17015102" 
    } 
    [6]=> array(2) { 
        [0]=> float(2.0366666666667) 
        [1]=> string(8) "14248330" 
    } 
    [3]=> array(2) { 
        [0]=> float(2.0366666666667) 
        [1]=> string(7) "9637191" 
    } 
    [4]=> array(2) { 
        [0]=> float(2.015) 
        [1]=> string(8) "11405473" 
    } 
    [5]=> array(2) { 
        [0]=> float(1.9833333333333) 
        [1]=> string(8) "28233403" 
    } 
} 

所以很酷我的数组按[0]索引的值排序。但.....

当我尝试像这样循环时......

$x = 0;
while ($x < count($sorted_array)) {
    $sorted_array[$x][0];
    $x++;
}

它不断打印出原始数组顺序。然后我意识到当我使用函数arsort()时,它保留了索引的原始顺序,以便它以原始数组顺序打印的原因。

是否有修复此功能的功能,以便我可以使用索引循环它?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

使用arsort()时,请保留密钥。

因为您正在使用$x进行迭代,所以您实际上忽略了排序调用。

在循环中使用rsort()

或在foreach()来电后使用arsort()圈。

或者最好,只需拨打array_column()而不是循环播放。

以下是一些演示:(Demo Link

$array=$copy=[
    [2.1166666666667,9434493],
    [2.07,8591971],
    [2.0566666666667,17015102],
    [2.0366666666667,9637191],
    [2.015,11405473],
    [1.9833333333333,28233403],
    [2.0366666666667,14248330],
    [2.0933333333333,14987165]
];
arsort($array);
var_export(array_column($array,0));  // <-- you lose the keys you preserved
echo "\n---\n";

foreach($array as $index=>$row){     // <-- you keep the keys you preserved
    echo "$index : {$row[0]}\n";
}

echo "\n---\n";
rsort($copy);                        // you don't preserve the keys
for($x=0, $count=sizeof($copy); $x<$count; ++$x){  // you should cache the count instead of calling count() on every iteration
    echo "$x : {$copy[$x][0]}\n";
}

输出:

array (
  0 => 2.1166666666667,
  1 => 2.0933333333333,
  2 => 2.07,
  3 => 2.0566666666667,
  4 => 2.0366666666667,
  5 => 2.0366666666667,
  6 => 2.015,
  7 => 1.9833333333333,
)
---
0 : 2.1166666666667
7 : 2.0933333333333
1 : 2.07
2 : 2.0566666666667
6 : 2.0366666666667
3 : 2.0366666666667
4 : 2.015
5 : 1.9833333333333

---
0 : 2.1166666666667
1 : 2.0933333333333
2 : 2.07
3 : 2.0566666666667
4 : 2.0366666666667
5 : 2.0366666666667
6 : 2.015
7 : 1.9833333333333

答案 1 :(得分:3)

rsort()非常适合这里。

  

按相反顺序对数组进行排序

此功能不维护索引关联

答案 2 :(得分:1)

快速浏览PHP文档表明rsort()可以正常工作。

http://php.net/manual/en/array.sorting.php