Php 使用另一个数组对关联数组进行排序';s有序键值关联
为这个找到合适的标题几乎是不可能的 想象一下这个场景: 我们有一个包含特定产品标签的数组。键是每个标记唯一的id,值是其标签: 可用标签Php 使用另一个数组对关联数组进行排序';s有序键值关联,php,arrays,sorting,associative-array,Php,Arrays,Sorting,Associative Array,为这个找到合适的标题几乎是不可能的 想象一下这个场景: 我们有一个包含特定产品标签的数组。键是每个标记唯一的id,值是其标签: 可用标签 Array ( [3] => Sweet [4] => Sour [5] => Bitter [6] => Winter [7] => Organic ) 我们有另一个数组,其中包含已选择的标记。选择具有特定顺序,该顺序由键定义,而值表示id(我们在数组#1中看到的实际标记) 按特定顺序选择的标签 Array
Array (
[3] => Sweet
[4] => Sour
[5] => Bitter
[6] => Winter
[7] => Organic
)
我们有另一个数组,其中包含已选择的标记。选择具有特定顺序,该顺序由键定义,而值表示id(我们在数组#1中看到的实际标记)
按特定顺序选择的标签
Array (
[10] => 4
[20] => 3
[30] => 7
)
我的理论方法
当然,我可以继续遍历第二个数组,在新数组中收集适当的值(对应于第一个数组的条目)。然后我可以迭代第一个数组,并将新数组中尚未出现的所有值(添加到新数组中)
说实话,这感觉不太专业。不幸的是,我不知道如何做得更好
问题
如何使用第二个数组(所选标记)定义的时间顺序对第一个数组(可用标记)进行整齐排序
注意
我希望得到第一个数组中的所有项。不仅仅是第二个列表中列出的那些
以防有人好奇:这适用于可排序的多个选择。已选择的项目是可排序的,因此必须以正确的顺序显示。其他物品的顺序无关紧要。我的服务器端数据处理程序类提供了上述两个数组,这就是我要处理的。我认为您可以循环第二个数组,并使用键构建一个新的数组
$new = array();
foreach($array2 as $key => $val)
{
$new_array[] = $array1[$val];
}
现在所选项目在您的$new\u数组中排序
这里有一个使用
uksort()
的解决方案。$tags
数组中不在$order
数组中的元素被排序到末尾,它们之间的相对顺序未定义
function my_sort($a, $b) {
global $order;
if(in_array($a, $order)) {
if(in_array($b, $order)) {
// Both $a and $b have an order
return array_search($a, $order) - array_search($b, $order);
}
else {
// Only $a has an order, so it goes before $b
return -1;
}
}
else if(in_array($b, $order)) {
// Only $b has an order, so it goes before $a
return 1;
}
else {
// Neither $a or $b has an order, so we don't care how they're sorted
return 0;
}
}
uksort($tags, 'my_sort');
不可能根据第二个数组中的顺序对第一个数组中的所有元素进行排序,因为第二个数组只引用第一个数组中的一些元素。您想对第二个数组中未引用的元素做什么?很好。当然,这是可能的。但是,你仍然是对的——剩下的怎么办?老实说并不重要。第二个数组中定义的条目以正确的顺序结束在排序数组中,这一点非常重要。其他条目可以保留在任何地方-在第二个数组中提到的条目之前或之后,也就是说。这些数据是否来自数据库?是的,实际上是这样。我希望避免迭代数组,而是能够使用一些PHP内置的数组处理函数(不幸的是,我没有很好地学习这些函数)。另外,我应该已经澄清并将相应地更新我的问题:我打算以第一个数组中的所有项目结束。不仅仅是第二个函数中的那些。如果您在函数中更改
-1
和1
的符号,则“无序”元素将首先出现。这就像一个符咒!非常感谢。我更喜欢将它用作传递给uksort()
的匿名函数,这样就可以避免使用global
。示例:uksort($tags,function($a,$b)use($order){…})代码>@SquareCat更好:)