2015-05-14 152 views
1

比方说,我有一个这样的数组:如何按特定过滤器对数组进行排序?

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

如何对它进行排序升序(第一(与当前项目客户将要订购的鞋子可用尺寸阵列)的α-尺寸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'); 

是否有某种功能要做到这一点?

+1

我认为你将不得不编写自己的功能。 – Rizier123

+0

或者你需要区分你自己的alpha值将是关键和数值将是他们各自的键的值为'array([s] => 36)' –

+0

@Uchiha:是的,这可以工作,我会尝试。谢谢。 – Legionar

回答

2

如果大小都被定义,那么你可以有一个包含所有有效尺寸一$baseArr和排序基于该

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; 
} 

测试当前ARR:

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

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

由Legionar编辑: 我打电话给这个函数,只有在没有数字大小的字母大小的情况下。有些尺寸是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; 
} 
+0

理论上可以定义它们,但它们不是,特别是数字大小。 – Legionar

+0

那么,你是否总是有第二个数组来排序第一个数组?或者这些字母总是一样的,先来一个,然后按照升序排列呢? – Samurai

+0

我会尝试使用你的解决方案,但只排序字母大小,他们可以被定义没有问题:-) – Legionar

1

看一看功能usort()

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

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

+0

谢谢。我想要的。 – Legionar

+0

@Legionar太棒了!记住它是正确的答案?:-) – Timo

+0

将尝试写它,然后当然是:-) – Legionar

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

+0

但是,这不会将字母大小排序为“S”,“M”,“L”,“XL”,“XXL”,“3XL”,否? – Legionar

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"); 

我加了el (如XS,4XL等)

+0

谢谢,这看起来也是正确的解决方案。 – Legionar

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); 
相关问题