2017-01-04 70 views
2

我想使用php以降序排列数组。php多维按字符串排序

'XXS','XS','S','M','L','XL','2X','3X','4X','5X','6','7','8','9','10','11'

$attributesData['attributes'][$key]['options'][$search]这将返回以下数组值及其商店$data['attributes'][$key]这个数组的存储之前,我想label$data['attributes'][$key]数组进行排序。

Array 
(
    [id] => 68 
    [label] => 2X 
) 
Array 
(
    [id] => 69 
    [label] => 3X 

) 
Array 
(
    [id] => 72 
    [label] => L 
) 
Array 
(
    [id] => 73 
    [label] => M 
) 

我尝试了很多方法,但没有得到正确的解决方案。

+0

它不应该是'...... '5X', '4倍', '3倍', '2X',... '?如果我们谈论降序 – RomanPerekhrest

+0

是的,你是可靠的,但我有这样的数组的数字 –

+0

它[***是***](http://stackoverflow.com/revisions/41458398/1)一个很好的问题。你有你的答案;现在开始实施,而不是要求红地毯。 – Xorifelse

回答

3

可以使用usort做到这一点:

$sizes = ['XXS' => 16, 'XS' => 15, 'S' => 14, 'M' => 13, 'L' => 12, 'XL' => 11, '2X' => 10, '3X' => 9, '4X' => 8, '5X' => 7, '6' => 6, '7' => 5, '8' => 4, '9' => 3, '10' => 2, '11' => 1]; 

usort($myArray, function($a, $b) use ($sizes) { 
    if ($a['label'] == $b['label']) { 
     return 0; 
    } 

    return $sizes[$a['label']] < $sizes[$b['label']] ? -1 : 1; 
}); 

var_dump($myArray); 
+0

错过'usort'。 :) –

1

你可以试试这个。它应该按array中的任意顺序排序

// Array of labels in order 
$order = ['XXS','XS','S','M','L','XL','2X','3X','4X','5X','6','7','8','9','10','11']; 
// values 
$array =[ 
[ 
    'id' => 68, 
    'label' => '2X', 
], 
[ 
    'id' => 69, 
    'label' => '3X', 

], 
[ 
    'id' => 72, 
    'label' => 'L', 
], 
[ 
    'id' => 73, 
    'label' => 'M', 
]]; 

$new = []; 
foreach($order as $o) { 
    // Get the index of the label in values 
    $pos = array_search($o, array_column($array, 'label')); 
    // If found store in new array 
    if($pos !== false) { 
     $new[] = $array[$pos]; 
    } 
} 

var_dump($new); 

输出

array(4) { 
    [0]=> 
    array(2) { 
    ["id"]=> 
    int(73) 
    ["label"]=> 
    string(1) "M" 
    } 
    [1]=> 
    array(2) { 
    ["id"]=> 
    int(72) 
    ["label"]=> 
    string(1) "L" 
    } 
    [2]=> 
    array(2) { 
    ["id"]=> 
    int(68) 
    ["label"]=> 
    string(2) "2X" 
    } 
    [3]=> 
    array(2) { 
    ["id"]=> 
    int(69) 
    ["label"]=> 
    string(2) "3X" 
    } 
} 

Demo

1

使用usort对它们进行排序。

$size = ['XXS','XS','S','M','L','XL','2X','3X','4X','5X','6','7','8','9','10','11']; 
$weight = array_flip($size); 
$result = usort($sortSize, function($a, $b) use($weight){return $weight[$b['label']] > $weights[$a['label']];}); 
0

认为这可能工作

<?php 

$a = Array(
    1 => Array(
     'id' => 68, 
     'label' => '2X' 
    ), 
    0 => Array(
     'id' => 69, 
     'label' => '3X' 
    ), 
    2 => Array(
     'id' => 70, 
     'label' => 'L' 
    ), 
    3 => Array(
     'id' => 71, 
     'label' => 'XXS' 
    ), 
    4 => Array(
     'id' => 72, 
     'label' => '11' 
    ), 
    5 => Array(
     'id' => 72, 
     'label' => 'M' 
    ), 
); 
function compareByName($a, $b) { 
    return strcmp($a["label"], $b["label"]); 
} 
usort($a, 'compareByName'); 
print_r(array_reverse($a)); ?> 

DEMO