【问题标题】:Sort an associative array by using another array's ordered key-value association使用另一个数组的有序键值关联对关联数组进行排序
【发布时间】:2014-03-09 23:44:04
【问题描述】:

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

想象一下这个场景:

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

可用标签

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

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

按特定顺序选择标签

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

我的理论方法

当然,我可以遍历第二个数组,在一个新数组中收集适当的值(对应于第一个数组的条目)。然后我可以遍历第一个数组并添加新数组中尚不存在的所有值(到新数组)。

说实话 - 感觉不是很专业。不幸的是,我不知道如何更好地做到这一点。

问题

如何使用第二个数组(Selected Tags)定义的年表对第一个数组(Available Tags)进行整齐排序?

注意

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

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

【问题讨论】:

  • 不可能根据第二个数组中的顺序对第一个数组的所有元素进行排序,因为第二个数组只引用了第一个数组的部分元素。你想对第二个数组中没有引用的元素做什么?
  • 好点。嗯,这是可能的,当然。但是,你是对的——剩下的怎么办?好吧,诚实并不重要。唯一重要的是,第二个数组中定义的条目以正确的顺序在排序后的数组中结束。其他条目可以保留在任何地方 - 在第二个数组中提到的条目之前或之后。
  • 这些数据是否来自数据库?
  • 是的,确实如此。

标签: php arrays sorting associative-array


【解决方案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');

【讨论】:

  • 如果你在函数中改变-11的符号,“无序”元素会优先出现。
  • 这就像一个魅力!谢谢!我更喜欢将它用作我传递给uksort() 的匿名函数,从而能够摆脱global 的使用。示例:uksort($tags, function($a,$b) use ($order) { ... });
  • @SquareCat 更好:)
【解决方案2】:

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

$new = array();
foreach($array2 as $key => $val)
{
    $new_array[] = $array1[$val];
}

现在所选商品已在您的$new_array 中订购

Sample

【讨论】:

  • 我希望避免对数组进行迭代,而是能够使用一些内置在数组处理函数中的 PHP(不幸的是,我没有很好地教授这些函数)。此外,我应该澄清并相应地更新我的问题:我打算以第一个数组中的所有项目结束。不仅仅是第二个中的那些。
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
相关资源
最近更新 更多