【问题标题】:Sort php array by value compared to another array与另一个数组相比,按值对php数组进行排序
【发布时间】:2014-01-08 18:55:37
【问题描述】:

如何根据另一个数组对一个数组进行排序? 我说的是价值观,而不是钥匙。我发现了很多关于如何对键进行排序的问题,但没有发现关于值的问题。

想象一下我有这个数组:

$sizes = array("L", "XXXL", "M", "S");

我怎样才能将它们重新排序为这样:

$newsizes = array("S", "M", "L", "XXXL");

基于这样一个固定的人类逻辑数组:

$sizeincrement = array("XS", "S", "M", "L", "XL", "XXL", "XXXL");

考虑到不在 sizeincrement 数组中的元素应该附加在末尾。

我认为这将作为一个现成的排序功能存在,但事实并非如此:PHP SORTING

【问题讨论】:

  • array_intersect() 将执行您需要的排序,而无需使用自定义函数或 usort。见my answer
  • @DigitalChris 虽然是否相交、然后是差异、然后合并数组确实是一种比 usort 更有效的方法是有争议的。 =)
  • @jszobody 不,我认为您错过了重点。我还回答了他关于“不在 sizeincrement 数组中的元素应附加在末尾”的第二部分。单线 array_intersect 完成了其他答案所做的事情。
  • 确实唯一错误的部分是不存在的元素被前置而不是附加3v4l.org/C2LtC

标签: php arrays sorting


【解决方案1】:

使用常见的数组函数可以做到这一点:

<?php
$sizes = array("L", "XXXL", "M", "S");

$sizeincrement = array("XS", "S", "M", "L", "XL", "XXL", "XXXL");

//this will give you the array you need in the order you need:
$sorted_array = array_intersect($sizeincrement,$sizes);

//now get the ones NOT in the array:

$missing_array = array_diff($sizeincrement,$sizes);

$final_array = array_merge($sorted_array, $missing_array);

var_dump($final_array);
?>

它正在运行:https://eval.in/87279

【讨论】:

  • 谢谢克里斯,考虑到我的问题的最后一部分,这是解决方案
【解决方案2】:

自定义函数可以很快完成这项工作!这是我的客人

$sizes = array("L", "XXXL", "M", "S");

function sort_size($arr) {
    $out = array();

    foreach (array("XS", "S", "M", "L", "XL", "XXL", "XXXL") as $size) {
        if (in_array($size, $arr)) {
            $out[] = $size;
        }
    }

    return $out;
}

$newSizes = sort_size($sizes);

您可以直接在 foreach 的数组中添加或删除新尺寸。

希望有所帮助!

【讨论】:

  • 我认为您的答案缺少参考数组中不存在某些值的情况,它们将丢失。我可能错了
  • 这给出了排序后的 $sizes,但不会将缺失的元素附加到末尾。
【解决方案3】:

您可以很容易地使用自定义的usort 回调函数来做到这一点。像这样的:

function compare($a, $b) {
    $sizeincrement = array("XS", "S", "M", "L", "XL", "XXL", "XXXL");
    if(!array_search($a, $sizeincrement)) return 1;
    if(!array_search($b, $sizeincrement)) return -1;
    return array_search($a, $sizeincrement) > array_search($b, $sizeincrement);
}

然后调用:

usort($sizes, "compare");

工作示例:http://3v4l.org/2Hp0g

【讨论】:

  • 您忘记在末尾添加不在初始数组中的那些。
  • @VincentDuprez 不看他的输出:它只有 4 个元素。
  • 赞成您的答案,因为它为我指明了正确的道路,谢谢,我会将 Digital chris 答案设置为正确答案,因为它正在考虑缺少的元素..
  • @VincentDuprez 不得不离开一会儿,抱歉。很高兴帮助您至少向您展示正确的道路,我强烈鼓励为此进行排序功能。更新了我的答案,如果需要为额外元素(或您可能需要考虑的其他任何事情)添加更多逻辑是微不足道的。
猜你喜欢
  • 2022-01-05
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
相关资源
最近更新 更多