function array_sort($array, $key){
if(is_array($array)){
$key_array = null;
$new_array = null;
for( $i = 0; $i < count( $array ); $i++ ){
$key_array[$array[$i][$key]] = $i;
}
ksort($key_array);
$j = 0;
foreach($key_array as $k => $v){
$new_array[$j] = $array[$v];
$j++;
}
unset($key_array);
return $new_array;
}else{
return $array;
}
}
PHP二维数组按键值排序
PHP 中 array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。关联键名保持不变,但数字键名会被重新索引。输入数组被当成一个表的列并以行来排序,第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。
但是如果需要排序的数组是一个二维数组,需要按照数组的键值排序,如下面这个二维数组,需要按照sort键名来排序,那么array_multisort() 就无法直接实现了:
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 ); |
将输出:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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 ; } |