#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