Попробуй создать базовую функцию для сортировки массива с помощью usort - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать простую функцию для сортировки массива с помощью usort, и я не понимаю, что не так с моим кодом.

Для теста я хочу упорядочить по полю 'str' в«нисходящий» порядок.

Мой массив для теста:

$tabCustom = array(
    0 => array(
        'str' => 'cccc',
        'nb' => 1
    ),
    1 => array(
        'str' => 'aaaa',
        'nb' => 3
    ),
    2 => array(
        'str' => 'bbb',
        'nb' => 2
    )
);

Вот код, который хорошо работает без пользовательской функции:

usort($tabCustom, function($a, $b)
{
    $order = 'desc';
    if($order == 'asc')
    {
        return strcasecmp($a['str'], $b['str']);
    }
    elseif($order == 'desc')
    {
        return strcasecmp($b['str'], $a['str']);
    }
});

Результат:

Array
(
    [0] => Array
        (
            [str] => cccc
            [nb] => 1
        )

    [1] => Array
        (
            [str] => bbb
            [nb] => 2
        )

    [2] => Array
        (
            [str] => aaaa
            [nb] => 3
        )

)

А теперь я пытаюсь создать пользовательскую функцию на основе того же кода:

function arraySort($array, $field, $order = 'asc')
{
    usort($array, function($a, $b)
    {
        global $field;
        global $order;
        if($order == 'asc')
        {
            return strcasecmp($a[$field], $b[$field]);
        }
        elseif($order == 'desc')
        {
            return strcasecmp($b[$field], $a[$field]);
        }
    });
}
arraySort($tabCustom, 'str', 'desc');

Неправильный результат:

Array
(
    [0] => Array
        (
            [str] => cccc
            [nb] => 1
        )

    [1] => Array
        (
            [str] => bbb
            [nb] => 2
        )

    [2] => Array
        (
            [str] => aaaa
            [nb] => 3
        )

)

Так что я не понимаючто не так, я поставил переменную global для $ field и $ order , потому что в противном случае код говорит Undefined variable, но сортировка моей таблицы не работает.

У вас есть представление о проблеме?

Спасибо:)

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Progrock прав - вы должны использовать use здесь ... Другая проблема - если вы определяете пользовательскую функцию - вы должны использовать ссылочный массив. Usort делает это уже автоматически, но вы должны определить его в своей собственной функции (оператор & является волшебным ключом для подобных ситуаций).

Должно работать следующее:

function arraySort(&$array, $field, $order = 'asc')
{
    usort($array, function($a, $b) use ($field, $order)
    {
        return ($order == 'desc')   ?   strcasecmp($b[$field], $a[$field])  :   strcasecmp($a[$field], $b[$field]);
    });
}
arraySort($tabCustom, 'str', 'asc');
1 голос
/ 11 октября 2019
<?php

function a($foo) {
    b();
}

function b() {
    global $foo;
    var_dump($foo);
}

a('bar');

Вывод:

NULL

$foo не входит в глобальную область.

Вы можете использовать «use» для наследования переменных из родительской области:

usort($array, function($a, $b) use ($field, $order) {
  // Your code here.
});
...