Сортировка ArrayObject

У меня проблема с сортировкой элементов в классе PHP, который расширяет ArrayObject.

Я создаю свои классы, и единственный способ добавить функцию cmp () — это поместить ее в тот же файл, но вне класса. Я не могу поставить его где-либо еще, потому что uasort требует имя функции в виде строки.

Итак, я делаю это:

class Test extends ArrayObject{

public function __construct(){
$this[] = array( 'test' => 'b' );
$this[] = array( 'test' => 'a' );
$this[] = array( 'test' => 'd' );
$this[] = array( 'test' => 'c' );
}


public function sort(){
$this->uasort('cmp');
}

}

function cmp($a, $b) {
if ($a['test'] == $b['test']) {
return 0;
} else {
return $a['test'] < $b['test'] ? -1 : 1;
}
}

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

Я предполагаю, что моя мысль в том, что это просто плохой способ сделать это. Есть ли другой способ сохранить cmp() функция внутри самого класса?

1

Решение

Вы можете просто сделать это, вместо вызова функции, просто сделать ее анонимной функцией.

Только PHP 5.3.0 или выше

class Test extends ArrayObject{

public function __construct(){
$this[] = array( 'test' => 'b' );
$this[] = array( 'test' => 'a' );
$this[] = array( 'test' => 'd' );
$this[] = array( 'test' => 'c' );
}


public function sort(){
$this->uasort(function($a, $b) {
if ($a['test'] == $b['test']) {
return 0;
} else {
return $a['test'] < $b['test'] ? -1 : 1;
}
});
}
}

Поскольку анонимные функции работают только на PHP 5.3.0 или выше, это будет более совместимым вариантом, если вам нужно ориентироваться на версии PHP ниже 5.3.0

Ниже PHP 5.3.0

class Test extends ArrayObject{

public function __construct(){
$this[] = array( 'test' => 'b' );
$this[] = array( 'test' => 'a' );
$this[] = array( 'test' => 'd' );
$this[] = array( 'test' => 'c' );
}


public function sort(){
$this->uasort(array($this, 'cmp'));
}

public function cmp($a, $b) {
if ($a['test'] == $b['test']) {
return 0;
} else {
return $a['test'] < $b['test'] ? -1 : 1;
}
}

}
4

Другие решения

Оказывается, это было правильно в PHP документации (раздел комментариев пользователей) -> http://php.net/manual/en/function.uasort.php

magikMaker 4 года назад
быстрое напоминание о синтаксисе, если вы хотите использовать uasort в классе или объекте:

<?php

// procedural:
uasort($collection, 'my_sort_function');

// Object Oriented
uasort($collection, array($this, 'mySortMethod'));

// Objet Oriented with static method
uasort($collection, array('self', 'myStaticSortMethod'));

?>
3