【发布时间】:2020-05-30 09:28:45
【问题描述】:
我有一个看起来像的数组
$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_id、region、region_id、city、city_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);
试验#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);
但其余订单不再维护。
所以我希望这些自定义字段以相同的顺序出现,而不会破坏其他人的位置。例如,name 应该首先出现,等等。
【问题讨论】:
-
uksort()会做我猜的工作 -
您为什么期望
name早点出现,而zip_code晚点出现?您是否期望原始订单以某种方式发挥作用?我没有看到逻辑。 -
我只希望那些顺序整理,其他的就这样吧。
-
但这并没有很好的定义。哪个元素(也出现在
$orders中)应该为其他匹配项定义锚点来组装?例如,为什么不是所有匹配项都移动到city_id之前的位置,所以它们与它相邻,所以zip_code会出现在第三位?您的示例非常简单,但如果匹配分布在一个非常大的数组中,并且完全无序,则可能会变得更加不清楚。比赛应该在哪里集合?