PHP — Сортировка массива

#php #arrays #sorting

#php #массивы #сортировка

Вопрос:

Итак, я хочу отсортировать массив в зависимости от того, что выбирает пользователь, мне удалось заставить все это работать (с небольшой помощью от вас, ребята), и теперь я пытаюсь очистить код. Это то, что у меня есть

 //Global Sorting Functions (For Rows to Columns)
//Function to sort up or down
function cmpdwn($a, $b) {
    return strcasecmp($a["Name"], $b["Name"]);
}

function cmpup($a, $b, $c) {
    return strcasecmp($b[$c], $a[$c]);
}

//Name Ordering Function ---------------------------------
function nameorder($data) {
    //If Up sorts Assending if Down Decending
    if ($_POST['Sortby'] == "NameDown") {
        uasort($data, "cmpdwn");
    } else {
        uasort($data, "cmpup");
    }

    $nameorder = array();
    $count = 0;
    while (list($key, $value) = each($data)) {
        $nameorder[$count] = $key;
        $count  ;
    }
    return $nameorder;
}
  

Это создает массив для заказа на печать данных в порядке имен, я буду повторять это и для электронной почты, и для других. Что я хотел сделать, так это повторно использовать функцию «cmp», введя в нее больше, чем $ a и $ b (т. Е. $ c = «Name», тогда я могу ввести «Email» или что-либо еще // cmpup в качестве примера). Но из того немногого, что я знаю, это то, что эта функция объявляет аргумент для uasort, и я не отправляю в него переменные. Есть ли способ сделать это или это случай повторного написания функции повторно

Спасибо и большая любовь

Комментарии:

1. я думаю , с целью улучшения вашего кода codereview.stackexchange.com это лучшее место, чтобы спросить 🙂

2. Учтено в следующий раз, спасибо

Ответ №1:

Попробуйте создать объект

 class MyComparator {

    private $key;

    function __construct($key) {
        $this->key = $key;
    }

    function compare($a, $b) {
        return strcasecmp($b[$this->key], $a[$this->key]);
    }

    public function setKey($key) {
        $this->key = $key;
    }
}
  

И используйте его

 $compararor = new MyComparator("Name");

usort($data, array($compararor, "compare"));
  

или
в php > = 5.3.0. вы можете использовать метод __invoke()

 class MyComparator {

    private $key;

    function __construct($key) {
        $this->key = $key;
    }

    function __invoke($a, $b) {
        return strcasecmp($b[$this->key], $a[$this->key]);
    }

    public function setKey($key) {
        $this->key = $key;
    }
}
  

И просто вызовите его с помощью

 $compararor = new MyComparator("Name");

usort($data, $compararor);
  

Комментарии:

1. прекрасный пример! <3

Ответ №2:

попробуйте это:

 // $a is N-th element, $b is next element and $arguments is array of arguments to use in compare logic
usort($array, function($a, $b) use ($arguments) {
     if($a>$b) return 1;
     if($a<$b) return -1;
     foreach($arguments as $argument) {
        if($a==$argument) {
           // return -1;0;1 as you wish
        }
     }
     return 0;
});
  

Комментарии:

1. Извините, поэтому используйте $arguements для ввода части массива, которую я хочу сравнить, т.Е. «Name» или «Email», а затем просто используйте $arguements, где я использовал «Name»?

2. Ваша проблема заключалась в передаче третьего или более параметров функции сортировки. итак, в моем примере я использую закрытие для его передачи. это может быть что угодно, например, use($someArg, $anotherArg), взятое отсюда: php.net//manual/en/functions . anonymous.php