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