使用另一个数组的有序键值关联对关联数组进行排序

时间:2014-03-09 23:44:05

标签: php arrays sorting associative-array

为此找到合适的标题几乎是不可能的。

想象一下这种情况:

我们有一个包含某些产品标签的数组。关键是每个标记的唯一 id ,其值为其标签:

可用标记

Array (
  [3] => Sweet
  [4] => Sour
  [5] => Bitter
  [6] => Winter
  [7] => Organic
)

我们有另一个数组,其中包含已选择的标记。选择具有由定义的特定顺序,而值表示 id (我们在数组#1中看到的实际标记)。

特定订单中的选定标签

Array (
  [10] => 4
  [20] => 3
  [30] => 7
)

我的理论方法

当然,我可以通过第二个数组进行预处理,在新数组中收集适当的值(对应于第一个数组的条目)。然后我可以迭代第一个数组并添加新数组中尚未出现的所有值(到新数组)。

老实说 - 这感觉不太专业。不幸的是,我不知道如何做得更好。

问题

如何使用第二个数组定义的年表(选定的标签)整齐排序第一个数组(可用标记)?

注意

我想结束第一个数组中的所有项目。不仅仅是第二个中列出的那些。

如果有人好奇:这是多选的,可以排序。已选择的项目是可排序的,因此必须以正确的顺序出现。其他项目顺序无关紧要。我的服务器端数据处理程序类给出了我所描述的这两个数组,这就是我必须使用的。

2 个答案:

答案 0 :(得分:1)

以下是使用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');

答案 1 :(得分:0)

我认为您可以在第二个数组中循环并使用键

构建一个新数组
$new = array();
foreach($array2 as $key => $val)
{
    $new_array[] = $array1[$val];
}

现在所选商品已在$new_array

中订购

Sample