Использование usort() с объектом, который реализует ArrayIterator

#php #arrays #usort

#php #массивы #usort

Вопрос:

У меня есть этот класс:

 class ResultSet 
    implements ArrayAccess, Countable, Iterator {
     /// Rest of implementation ...
}
  

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

Точная ошибка, возвращаемая php, такова: Warning: usort() expects parameter 1 to be array, object given .

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

1. Даже ArrayObject страдающие от этого, я бы сказал, что это либо ошибка, либо, по крайней мере, нежелательная устаревшая проблема…

Ответ №1:

Откуда usort знать, как вы реализовали ArrayAccess ? Нет определенного места, где хранятся значения — в этой гибкости заключается весь смысл интерфейса.

Если вы храните элементы в массиве, который является закрытым элементом объекта, вы могли бы выполнить usort операцию через прокси. Например:

 public function usort($callback) {
    usort($this->container, $callback);
}
  

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

1. Я бы предположил, что usort () мог бы внутренне вызвать class_implements() (или что-то в этом роде) и выяснить, может ли то, что вы передаете, вести себя как массив. Я также не могу использовать прокси, поскольку мой внутренний массив содержит всевозможные объекты, но я могу придумать что-нибудь в этом роде. Спасибо!

Ответ №2:

Если мне не изменяет память, на странице ArrayAccess или в одном из комментариев к ней есть большой предупреждающий знак (на самом деле, вероятно, последнее). В основном это говорит о чем-то в порядке: интерфейс несколько бесполезен, потому что функции массива PHP не распознают ни один из его элементов как массивы.