我有这个数组:
$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);
答案 0 :(得分:2)
不是对每个元素进行线性搜索,而是通过代码重新索引原始数组可能是最快的:
// 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];
}
答案 1 :(得分:2)
$target_flip = array_flip($target);
usort($routes, function($a, $b) use ($target_flip){
return ($target_flip[$a['code']] < $target_flip[$b['code']]) ? -1 : 1;
});
演示:
文档:
答案 2 :(得分:2)
一个更通用的解决方案,你可以设置你想要排序的密钥,它应该适用于任何多维数组。
//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)
答案 3 :(得分:1)
如果是array_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);
答案 4 :(得分:1)
除了已经提到的答案(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 );
当然,这只是一个小例子,如果你试图按字母顺序索引它们。如果你需要它按一组精确的键排序,而不是按字母顺序排序,那么它可能有点棘手,因为它不接受任何其他参数。