在PHP中,想要将数组按照键值大小进行排序,使用array_multisort很容易就可以完成。但是这个函数会打乱原有key值,比如下面这段程序:
1 2 3 4 5 6 7 8 9 10 11 12 | $data [5] = array ( 'volume' => 67, 'edition' => 2); $data [4] = array ( 'volume' => 86, 'edition' => 1); $data [2] = array ( 'volume' => 85, 'edition' => 6); $data [3] = array ( 'volume' => 98, 'edition' => 2); $data [1] = array ( 'volume' => 86, 'edition' => 6); $data [6] = array ( 'volume' => 67, 'edition' => 7); // 准备要排序的数组 foreach ( $data as $k => $v ) { $edition [] = $v [ 'edition' ]; } array_multisort ( $edition , SORT_ASC, $data ); print_r( $data ); |
将输出:
Array ( [0] => Array ( [volume] => 86 [edition] => 1 ) [1] => Array ( [volume] => 67 [edition] => 2 ) [2] => Array ( [volume] => 98 [edition] => 2 ) [3] => Array ( [volume] => 85 [edition] => 6 ) [4] => Array ( [volume] => 86 [edition] => 6 ) [5] => Array ( [volume] => 67 [edition] => 7 ) )
为了不破坏原有的key,写了一个排序函数,仅支持二维数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * 根据数组中的某个键值大小进行排序,仅支持二维数组 * * @param array $array 排序数组 * @param string $key 键值 * @param bool $asc 默认正序 * @return array 排序后数组 */ function arraySortByKey( array $array , $key , $asc = true) { $result = array (); // 整理出准备排序的数组 foreach ( $array as $k => & $v ) { $values [ $k ] = isset( $v [ $key ]) ? $v [ $key ] : '' ; } unset( $v ); // 对需要排序键值进行排序 $asc ? asort( $values ) : arsort( $values ); // 重新排列原有数组 foreach ( $values as $k => $v ) { $result [ $k ] = $array [ $k ]; } return $result ; } |
3 条评论
// 整理出准备排序的数组
foreach ( $array as $k => &$v ) {
这一行有点问题,虽然还不知道原因,但去掉&就可以了
谢谢,这是因为没有注销引用变量,在下面的foreach中起了冲突。去掉&是可以的,或者用过之后进行注销,比如在16行加入unset($v);一句。
很有用,帮了大忙,谢谢你的文章。