PHP заказной массив - PullRequest
       4

PHP заказной массив

1 голос
/ 25 октября 2010

Массив поступает с некоторыми или всеми из следующих значений в любом порядке.Как лучше всего заказать их в порядке возрастания размера?Итак, начиная с малого и заканчивая XXL.Я могу использовать, но я немного растерялся относительно того, как элементы должны быть упорядочены в моей пользовательской функции

Small
XXL
Medium
Large 
XL

РЕДАКТИРОВАТЬ: пропустить некоторую информацию, поэтому создал новый вопрос Массив пользовательских упорядочений с ключом / значениемпары

EDIT2: полный код

print_r($sizes);
$sorted_sizes = $this->sort_sizes(array_unique($sizes));
print_r($sorted_sizes);

function sort_sizes($sizes)
{
    return uasort($sizes, array($this, 'cmp'));
}

function cmp($a,$b)
{
    $sizeArray = array( 'Small' => 0, 'Medium' => 1, 'Large' => 2, 'XL' => 3, 'XXL' => 4); 
    return $sizeArray[$a] - $sizeArray[$b];
}

Это выводит:

Array
(
    [66-507cddcd16d9786abafccfa78b19acf8] => XL
    [64-507cddcd16d9786abafccfa78b19acf8] => medium
    [65-507cddcd16d9786abafccfa78b19acf8] => large
    [63-507cddcd16d9786abafccfa78b19acf8] => small
)

и print_r ($ sorted_sizes) просто дает вывод "1"

Ответы [ 3 ]

6 голосов
/ 25 октября 2010

Обновленный ответ по полному коду

Первая проблема заключается в том, что вы возвращаете результат uasort():

function sort_sizes($sizes)
{
    return uasort($sizes, array($this, 'cmp'));
}

Это неправильно, потому что uasort() не возвращает отсортированный массив. Он изменяет ту же переменную, которую вы передаете в качестве параметра, и возвращает логическое значение. Вот почему вы видите 1 как вывод.

Заставить метод принять $sizes по ссылке:

function sort_sizes(array &$sizes)
{
    uasort($sizes, array($this, 'cmp'));
}

Тогда назовите это так:

print_r($sizes);
$sorted_sizes = array_unique($sizes);
$this->sort_sizes($sorted_sizes);
print_r($sorted_sizes);

Вот ваш cmp() метод с добавленной поддержкой сортировки без учета регистра:

function cmp($a, $b)
{
    $sizes = array('small' => 0, 'medium' => 1, 'large' => 2, 'xl' => 3, 'xxl' => 4);
    return $sizes[strtolower($a)] - $sizes[strtolower($b)];
}

Старый ответ

Попробуй это. Вместо этого используйте uasort(), если вы хотите поддерживать пары ключ-значение :

function sort_sizes($a, $b) {
    // Map the sizes to an ordered sequence of ints
    static $sizes = array('small' => 0, 'medium' => 1, 'large' => 2, 'xl' => 3, 'xxl' => 4);

    // Find the difference, using the sizes as keys to the above array
    return $sizes[strtolower($a)] - $sizes[strtolower($b)];
}

$arr = array('Small', 'XXL', 'Medium', 'Large', 'XL');

print_r($arr); // Before sorting
uasort($arr, 'sort_sizes');
print_r($arr); // After sorting

Выход:

Array
(
    [0] => Small
    [1] => XXL
    [2] => Medium
    [3] => Large
    [4] => XL
)
Array
(
    [0] => Small
    [2] => Medium
    [3] => Large
    [4] => XL
    [1] => XXL
)
3 голосов
/ 25 октября 2010

Вы можете сделать это, используя array_multisort:

$orderIndex = array_flip(array('Small','Medium','Large','XL','XXL'));
$arr = array('Small','XXL','Medium','Large','XL');
array_multisort(array_map(function($val) use ($orderIndex) { return $orderIndex[$val]; }, $arr), $arr);

Здесь array_map используется с анонимной функцией дляпостроить массив «веса» каждого значения в $arr.Этот массив затем используется для упорядочения значений в $arr.

Это в основном тот же , который BoltClock предложил только при сравнении уже рассчитанных «весов».

1 голос
/ 25 октября 2010

Выполнить сортировку в два этапа. Сначала преобразуйте текст в удобное числовое значение. В этот момент вы должны решить, соответствуют ли «L» и «Large» одному и тому же значению или нет. Затем измените порядок массива на основе этих числовых преобразований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...