Php 基于普通数组顺序的多维数组排序
我有这个阵列:Php 基于普通数组顺序的多维数组排序,php,arrays,sorting,multidimensional-array,Php,Arrays,Sorting,Multidimensional Array,我有这个阵列: $routes = array( array( 'code' => 'PZSA', 'name' => 'PLaza san antonio', ), array( 'code' => 'AVAD', 'name' => 'Av de asturias', ), array( 'code' => 'AVAR', 'name' => 'Av simon nieto
$routes = array(
array(
'code' => 'PZSA',
'name' => 'PLaza san antonio',
),
array(
'code' => 'AVAD',
'name' => 'Av de asturias',
),
array(
'code' => 'AVAR',
'name' => 'Av simon nieto',
)
);
我想根据下一个键对其进行排序:
$target = array('AVAD', 'AVAR', 'PZSA');
因此,排序后的数组将是:
Array
(
[0] => Array
(
[code] => AVAD
[name] => Av de asturias
)
[1] => Array
(
[code] => AVAR
[name] => Av simon nieto
)
[2] => Array
(
[code] => PZSA
[name] => PLaza san antonio
)
)
我已经试过了,但我认为对于这个简单的东西来说,代码太多了。还有别的选择吗?谢谢
function _sort($array, $orderArray) {
$ordered = array();
foreach ($orderArray as $key) {
$ordered[] = find($key, $array);
}
return $ordered;
}
function find($code, $routes) {
foreach ($routes as $key => $value) {
if ($routes[$key]['code'] == $code) {
return $routes[$key];
}
}
}
$sorted = _sort($routes, $target);
与其对每个元素进行本质上的线性搜索,不如通过代码对原始数组重新编制索引:
// create the index
$indexed = array();
foreach($routes as $route) {
$indexed[$route['code']] = $route;
}
// add each target to a new sorted array in order
$sorted = array();
foreach($target as $code) {
$sorted[] = $indexed[$code];
}
$target\u flip=array\u flip($target);
usort($routes,function($a,$b)use($target\u flip){
返回($target_flip[$a['code']]<$target_flip[$b['code']])?-1:1;
});
演示:
array\u multisort
如果:
foreach ($routes as $key => $row) {
$code[$key] = $row['code'];
$name[$key] = $row['name'];
}
array_multisort($code, SORT_ASC, $name, SORT_ASC, $routes);
print_r( $routes );
这样你甚至不需要第二个阵列
事实上,在您的情况下,您只需要对代码进行排序,这样就可以实现以下目的:
foreach ($routes as $key => $row) {
$code[$key] = $row['code'];
}
array_multisort($code, SORT_ASC, $routes);
这是一个更通用的解决方案,您可以只设置要排序的键,它应该适用于任何多维数组
//key to sort by
$sortBy = 'code';
$sorted = array();
foreach($routes as $route) {
foreach($route as $key => $value) {
if(!isset($sorted[$key])) {
$sorted[$key] = array();
}
$sorted[$key][] = $value;
}
}
array_multisort($sorted[$sortBy], SORT_ASC, $routes);
print_r($routes)
除了前面提到的答案(Peter除外),您还可以使用
uasort()
使用您的逻辑。首先必须定义一个比较函数(将$a与$b进行比较),并使用值-1
、0
和1
构建逻辑,以决定比较的行应该在前面、后面还是保持不变
// This sorts simply by alphabetic order
function reindex( $a, $b )
{
// Here we grab the values of the 'code' keys from within the array.
$val1 = $a['code'];
$val2 = $b['code'];
// Compare string alphabetically
if( $val1 > $val2 ) {
return 1;
} elseif( $val1 < $val2 ) {
return -1;
} else {
return 0;
}
}
// Call it like this:
uasort( $routes, 'reindex' );
print_r( $routes );
//这只是按字母顺序排序
函数重新索引($a,$b)
{
//这里我们从数组中获取“code”键的值。
$val1=$a[‘代码’];
$val2=$b[‘代码’];
//按字母顺序比较字符串
如果($val1>$val2){
返回1;
}elseif($val1<$val2){
返回-1;
}否则{
返回0;
}
}
//可以这样称呼:
uasort($routes,'reindex');
印刷(路线);
当然,这只是一个小例子,如果您试图按字母顺序对它们进行索引。如果您需要它按一组精确的键排序,而不是按字母顺序排序,那么它可能会有点棘手,因为它不接受任何其他参数
有两件事可以最小化,例如,
$routes[$key]['code']
可以变成$value['code']
,但是多维数组搜索通常需要一个自定义函数(或两个)这样的函数。您可以使用该代码作为数组的键吗?然后,您只需按键查找值。这样您甚至不需要第二个数组代码>。是的。您需要额外的两个数组:-)当然;)我的意思是,您不需要提取代码值,相同的循环将处理这个问题。
// This sorts simply by alphabetic order
function reindex( $a, $b )
{
// Here we grab the values of the 'code' keys from within the array.
$val1 = $a['code'];
$val2 = $b['code'];
// Compare string alphabetically
if( $val1 > $val2 ) {
return 1;
} elseif( $val1 < $val2 ) {
return -1;
} else {
return 0;
}
}
// Call it like this:
uasort( $routes, 'reindex' );
print_r( $routes );