如何通过特定的过滤器对数组进行排序?

时间:2015-05-14 13:02:41

标签: php arrays sorting

让我们说,我有一个这样的数组:

$arr = array('M', '38', '37', '3XL', 'XL', '39', 'L', 'S', '36', '41', '40', 'XXL');

(其数组中包含客户要订购的当前商品的可用尺码)

如何对它进行升序排序(第一个alpha尺寸:S,M,L,XL,XXL,3XL;然后是数字尺寸:36,37,38,39,40,41),所以我会得到数组:

$res = array('S', 'M', 'L', 'XL', 'XXL', '3XL', '36', '37', '38', '39', '40', '41');

是否有某些功能可以做到这一点?

5 个答案:

答案 0 :(得分:2)

如果定义了大小,那么您可以让$baseArr包含所有有效大小,并根据该大小对当前arr进行排序

function sortSizeArr($arr) {
    $baseArr = array('S', 'M', 'L', 'XL', 'XXL', '3XL', '36', '37', '38', '39', '40', '41');
    $sortedArr = array();
    for($i = 0; $i < count($baseArr); $i++) {
        if(in_array($baseArr[$i], $arr))
            array_push($sortedArr, $baseArr[$i]);
    }
    return $sortedArr;
}

测试:

$sizes = array('M', '38', 'S', '36', '41', '40', 'XXL');
print_r(sortSizeArr($sizes));
  

阵列([0] =&gt; S [1] =&gt; M [2] =&gt; XXL [3] =&gt; 36 [4] =&gt; 38 [5] =&gt; 40 [6]   =&GT; 41)

由Legionar编辑: 我正在调用此函数,只有在存在alpha大小且没有数字大小的情况下。有些尺寸是f.e. M/5, L/6, XL/7, XXL/8,所以我改变了你的功能。这对我有所帮助,谢谢:

function sortSizeArr($arr) {
    $baseArr = array('XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL', '3XL');

    $sortedArr = array();

    for ($i = 0; $i < count($baseArr); $i++) {
        /*if (in_array($baseArr[$i], $arr)) {
            array_push($sortedArr, $baseArr[$i]);
        }*/

        foreach ($arr as $val) {
            $check = reset(explode('/', $val));

            if (strpos($val, $baseArr[$i]) === 0) {
                array_push($sortedArr, $val);
            }
        }
    }

    return $sortedArr;
}

答案 1 :(得分:1)

查看函数usort()

http://php.net/manual/en/function.usort.php

它允许您使用自定义比较功能对数组进行排序。对于您的情况,实现此功能应该相当简单。

答案 2 :(得分:1)

以下是按字母顺序排列数组的另一个示例:

<?php

$array = array('M', '38', '37', '3XL', 'XL', '39', 'L', 'S', '36', '41', '40', 'XXL');

foreach ($array as $key => $value) {
    if (ctype_digit($value)) {
        $array[$key] = intval($value);
    }
}

sort($array);

echo "After Sorting".'<pre>';
print_r($array);
echo '</pre>';

?>

供您参考和输出Click Here

答案 3 :(得分:1)

如果您需要数字大小,您可以执行以下操作:

function size_sort($a, $b) {
    return determine_value($a) < determine_value($b) ? -1 : 1;
}

function determine_value($var) {
    $letter_sizes = array("S" => 1, "M" => 2, "L" => 3, "XL" => 4, "XXL" => 5, "3XL" => 6);
    if(array_key_exists($var, $letter_sizes))
        return $letter_sizes[$var];
    elseif(is_numeric($var))
        return $var + 100; // add 100 so its value is higher than any letter sizing
    else
        return 10000; // unknown size, make sure it is at the end
}
usort($arr, "size_sort");

我添加了一个其他条件,如果遗漏任何字母大小(即XS,4XL等)

答案 4 :(得分:1)

添加变体。仅建议大小不超过7:

$arr = array('M', '38', '37', '3XL', 'XL', '39', 'L', 'S', '36', '41', '40', 'XXL');

$sizes = array('S', 'M', 'L', 'XL', 'XXL', '3XL');
var_export($arr);
usort($arr, function ($a, $b){ 
        global $sizes;
        $a = is_numeric($a) ? $a : array_search($a, $sizes);
        $b = is_numeric($b) ? $b : array_search($b, $sizes);
        return $a-$b;
});
var_export($arr);