PHP自定义排序:根据指定的键手动对数组进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP自定义排序:根据指定的键手动对数组进行排序相关的知识,希望对你有一定的参考价值。

我有一个看起来像的数组

$array = [
    //...
    'name' => ['value' => 'Raj KB'],
    'street' => ['value' => 'Street ABC'],
    'city' => ['value' => 'Dubai'],
    'country_id' => ['value' => 'UAE'],
    'region' => ['value' => 'DXB'],
    'region_id' => ['value' => 11],
    'zip_code' => ['value' => 12345],
    'city_id' => ['value' => 22],
    //...
];

我想对数组进行排序,以便键country_idregionregion_idcitycity_id顺序出现。例如,最终输出应类似于

 $array = [
    //...
    'name' => ['value' => 'Raj KB'],
    'street' => ['value' => 'Street ABC'],
    'country_id' => ['value' => 'UAE'],
    'region' => ['value' => 'DXB'],
    'region_id' => ['value' => 11],
    'city' => ['value' => 'Dubai'],
    'city_id' => ['value' => 22],
    'zip_code' => ['value' => 12345],
    //...
];

我尝试过:

审判#1

uksort($array, function ($a, $b) 

  $order = ['country_id' => 0, 'region' => 1, 'region_id' => 2, 'city' => 3, 'city_id' => 4];
  if (isset($order[$a]) && isset($order[$b])) 
    return $order[$a] - $order[$b];
   else 
    return 0;
  
);

var_dump($array);

Trial#2

uksort($array, function ($a, $b) 

  $order = ['country_id' => 0, 'region' => 1, 'region_id' => 2, 'city' => 3, 'city_id' => 4];
  if (!isset($order[$a]) && !isset($order[$b])) 
    return 0;
   elseif (!isset($order[$a])) 
    return 1;
   elseif (!isset($order[$b])) 
    return -1;
   else 
    return $order[$a] - $order[$b];

  
);

var_dump($array);

但是它没有按预期工作。

答案

您的实现非常接近,但是您必须在比较函数中考虑以下情况:仅存在您想要的一个键,而没有其他任何键。如果您在这种情况下return 0,它们将在数组的其他键中变形(因为在这种情况下,它们的位置被认为是相等的。)

通过处理这两种特殊情况,可以对要彼此出现的键进行显式排序,您得到的结果将满足您的要求:

uksort($array, function ($a, $b)     
  $order = ['country_id' => 1, 'region' => 2, 'region_id' => 3, 'city' => 4, 'city_id' => 5];
  if (isset($order[$a]) && isset($order[$b])) 
    return $order[$a] - $order[$b];
   else if (isset($order[$a])) 
    return 1;
   else if (isset($order[$b])) 
    return -1;
   else 
    return 0;
  
);

输出:

array(8) 
  'zip_code' =>
  array(1) 
    'value' =>
    int(12345)
  
  'street' =>
  array(1) 
    'value' =>
    string(10) "Street ABC"
  
  'name' =>
  array(1) 
    'value' =>
    string(6) "Raj KB"
  
  'country_id' =>
  array(1) 
    'value' =>
    string(3) "UAE"
  
  'region' =>
  array(1) 
    'value' =>
    string(3) "DXB"
  
  'region_id' =>
  array(1) 
    'value' =>
    int(11)
  
  'city' =>
  array(1) 
    'value' =>
    string(5) "Dubai"
  
  'city_id' =>
  array(1) 
    'value' =>
    int(22)
  

以上是关于PHP自定义排序:根据指定的键手动对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

php多维数组自定义排序 uasort()

按自定义顺序对数组的php数组进行排序

PHP 数组排序

PHP数组排序

使用字典中的键对对象数组进行排序

如何根据自定义所需顺序对包含列表的数组列表进行排序