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

5 回答 5

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];
}
于 2013-10-10T21:44:51.903 回答
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;
});

演示:

文件:

于 2013-10-10T21:45:01.087 回答
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)
于 2013-10-10T21:59:44.090 回答
1

除了已经提到的答案(彼得除外)之外,您可以将您的逻辑与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 );

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

PHP uasort() 参考

于 2013-10-10T22:12:59.270 回答
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);
于 2013-10-10T21:51:49.903 回答