2017-01-04 2 views
2

Я хочу отсортировать массив по убыванию, используя php.php multi dimension sort by string

как '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Х', '3X', '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