2015-05-14 154 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); 
相關問題