2013-10-10 118 views
0

我有此数组:排序基于普通数组的顺序多维数组

$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); 
+1

有几件事情可以最小化,'$ routes [$ key] ['code']'可以变成'$ value ['code']'但是多维数组搜索通常需要像这样的自定义函数(或两个) –

+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

这就是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); 
+2

'那样你甚至不需要第二个数组!'。是的。你需要额外的两个数组:-) – Peter

+0

当然;)我的意思是,你不需要提取代码值,同样的循环会照顾到这一点。 –

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) 
1

或者已经提到(与彼得除外)的答案,你可以用你的逻辑与uasort()。您首先必须定义一个比较函数(比较$ a到$ b),然后使用值-1,01来构建逻辑,以确定比较的行应该在之前,之后还是保持不变。

// 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); 

当然,这只作为一个小例子,并且如果您试图按字母顺序对它们编制索引。如果你需要用一组确切的键排序,而不是按字母顺序排序,那么它可能会有点棘手,因为它不接受任何其他参数。

PHP uasort() Reference