@phpcoder81

Как передать значение поля в функцию uasort?

class Test{

    public $data = [];

    public function setData(array $data){
        $this->data = $data;
    }

    public function getData(){
        return $this->data;
    }

    public function mySort(){
        uasort($this->data, array($this, 'cmp'));
    }
  
    private function cmp($a, $b){
        if($a['price'] == $b['price']){
            return 0;
        }
        return ($a['price'] < $b['price']) ? -1 : 1;
    }

}

$a = array(
    1 => array('name' => 'Товар 1', 'price' => 900),
    2 => array('name' => 'Товар 2', 'price' => 1200),
    3 => array('name' => 'Товар 3', 'price' => 300),
    4 => array('name' => 'Товар 4', 'price' => 1100)
);

$b = new Test();
$b->setData($a);
$b->mySort();
var_dump($b->getData());

Если я захочу сравнить не по полю price, а по другому, мне метод новый писать? Или можно как-то передать параметр в функцию uasort?
  • Вопрос задан
  • 244 просмотра
Решения вопроса 2
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Добавьте в метод cmp ещё 2 аргумента, третий это ключ, четвёртый чтоб сортировку указать

public function cmp($array, $key, $sort = 1) {
    return uasort($array, function ($a, $b) use ($key, $sort) {
    return $sort ? $a[$key] <=> $b[$key] : $b[$key] <=> $a[$key];
    }
}

Как то так. С тела не очень удобно пилить
Пример как я у себя подобное сделал через анонимку
https://github.com/Compolomus/BinaryFileStorage/bl...
Ответ написан
bigton
@bigton
Web-программист
$array = [
    1 => ['name' => 'Товар 1', 'price' => 900],
    2 => ['name' => 'Товар 2', 'price' => 1200],
    3 => ['name' => 'Товар 3', 'price' => 300],
    4 => ['name' => 'Товар 4', 'price' => 1100],
];

$key = 'price';

uasort($array, function ($a, $b) use ($key) {
    return $a[$key] <=> $b[$key];
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы