Что такое коллекция объектов в php

818
18 января 2017, 03:00

Собственно есть задача, создать объект со вложенной коллекций объектов tickets. Но что это такое?

Вот есть объект со вложенным объектом tickets:

    stdClass Object
(
    [email] => asd@asd.ru
    [phone] => +79243000155
    [tickets] => stdClass Object
        (
            [ticketType] => Adult
            [person] => Array
                (
                    [fullName] => Хабраков Иван Иванович
                    [FirstName] => Иван
                )
        )
)

tickets нужно представить в виде коллекции объектов. А как он должен выглядеть и, соответственно, создаваться?

Answer 1

Скорей всего в задаче подразумевается использовать это: https://ru.wikipedia.org/wiki/Коллекция_(программирование)

Можете реализовать свою коллекцию по интерфейсу: http://php.net/manual/ru/class.ds-collection.php

Collection Данный интерфейс предназначен для описания базовых функций работы с множеством объектов. Он наследует интерфейсы Countable и Iterable, что позволяет получать количество объектов в коллекции и выполнять обход и применение пользовательской функции для каждого объекта коллекции. Интерфейс коллекции подразумевает, что в коллекции находятся объекты одного типа.

В вашем случае больше всего подойдёт реализация коллекции наборы.

Реализации наборов Наборы представлены единственной реализацией UniqueStore. Объекты в хранилище UniqueStore. Уникальность объектов обеспечивается за счет метода getIdentity(), который возвращает идентификаторы объектов. В хранилище UniqueStore не могут присутствовать несколько объектов с одинаковыми идентификаторами. Внутренняя структура хранилища уникальных объектов UniqueStore построена на основе ассоциативных связей между объектами и их идентификаторами. Это дает возможность реализовывать все операции хранилища с помощью ассоциативных выборок, что очень сильно повышает скорость его работы. Сложность работы алгоритмов хранилища уникальных объектов равна O(1), что означает, что время установки/получения объектов не изменяется в зависимости от размера хранилища. Хранилище уникальных объектов UniqueStore поддерживает любые типы данных для значений.

Примеры использования набора:


namespace Rmk\Collection;
use \UnexpectedValueException as UnexpectedValueException;
use \InvalidArgumentException as InvalidArgumentException;
use \stdClass as stdClass;
include '../../bootstrap.php';
$set = new UniqueStore('stdClass');
$obj1 = new stdClass();
$obj2 = new stdClass();
$obj3 = new stdClass();
// Добавление объектов в хранилище.
$set->add($obj1);
$set->add($obj2);
$set->add($obj3);
// Повторно объекты в хранилище добавлены не будут.
$set->add($obj3);
try {
    $set->add(new UnexpectedValueException);
} catch (InvalidArgumentException $exc) {
    echo 'Значение не подходит по типу.';
}
// Обход хранилища.
$set->each(function($value, $thisSet) {
            /**
             * @TODO: Обработка хранилища.
             */
        }
);
// Удаление объектов из хранилища.
$set->remove($obj1);
$set->remove($obj2);
$set->remove($obj3);
// Преобразование в массив.
$array = $set->toArray();

Источник: https://habrahabr.ru/post/144182/

Answer 2

Возможно я буду не прав, и где то поторопился, но почему не сделать коллекцию например так ?

Я не отрицаю, что сейчас здесь мало методов, еще можно добавить поиск по билетам и еще возможно что-то, но задача задать вектор мышления.

<?php
Class Ticket {
    protected $ticketType;
    protected $person;
    public function __construct($ticketType,$person) {
        $this->ticketType = $ticketType;
        $this->person     = $person;
    }
}
Class Collection implements Iterator, Countable {
    private $tickets = array();
    private $position;
    public function __construct(){
        $this->position = 0;
    }
    //Добавить элемент в массив
    public function push($ticket) {
        if($ticket instanceof Ticket === false) {
            throw new InvalidArgumentException('Попытка добавить не верный тип');
        }
        array_push($this->tickets,$ticket);
    }
    //Взять последний добавленный
    public function pop() {
        array_prop($this->tickets,$ticket);
    }
    //Ниже Методы для реализации интерфейса Iterator
    function rewind() {
        $this->position = 0;
    }
    function current() {
        return $this->tickets[$this->position];
    }
    function key() {
        return $this->position;
    }
    function next() {
        ++$this->position;
    }
    function valid() {
        return isset($this->tickets[$this->position]);
    }

    function count(){
        return count($this->tickets);
    }
}
$ticketJhon = new Ticket('emptyTicket',"John");
$ticketJane = new Ticket('emptyTicket',"Jane");
$collection = new Collection();
$collection->push($ticketJhon);
$collection->push($ticketJane);
foreach($collection as $ticket) {
    print_r($ticket);
}
$ticketStr = 'Не билет';
$collection->push($ticketStr);
READ ALSO
PUT FormData laravel. Не принимаются данные

PUT FormData laravel. Не принимаются данные

Отправляю данные серверу для обновления с помощью метода PUTДанные отправляю с помощью FormData

461
Нежелательное изменение HTML DOMDocument

Нежелательное изменение HTML DOMDocument

При загрузке шаблона smarty в DOMDocument и последующей выгрузке через saveHTML, появляются нежелательные теги <p> в начале и в конце контентаТакже...

381
Сравнение времени PHP (H:m)

Сравнение времени PHP (H:m)

В базе хранятся данные о времени работы компании в формате: 09:00,18:30; 12:00,02:00 и тд

418
Как использовать FOSOAuthServerBundle в symfony 2.8

Как использовать FOSOAuthServerBundle в symfony 2.8

Начал открывать для себя symfony2Решил прикрутить oAuth2 (FOSOAuthServerBundle), сделал всё по доке

364