Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$list->each(function(){...});
foreach ($list as $k=>$v) {...}
// Iterable.php
interface Iterable {
// ...
}
$objectMap = new HashMap('stdClass', 'stdClass');
try {
$objectArray = $objectMap->toArray();
} catch (UnexpectedValueException $exc) {
echo 'Объекты не могут являться ключами массива.';
}
foreach ($list as $k=>$v) {...}$map->setUnit( $unit, new Point(43, 12) );
$map->getUnitCoord( $unit );
function setUnit (Unit $unit, Point $coord) {
$this->units[$unit->id] = $coord;
}
function setUnit (Unit $unit, Point $coord) {
$this->units->set( $unit, $coord );
}
function setUnit (Unit $unit, Point $coord) {
$this->units[$unit->id] = $coord;
}А если юнит перемещается по карте, то его придётся постоянно в перемещать в коллекции? Т.е. перестраивать массив.
$collection->rm($unit);
$collection->set($unit, new Point(2,3));
По моему, это не правильно. Должна быть коллекция юнитов и у каждого юнита должно быть свойство $coords. Если надо найти всех юнитов в клетке, то придётся пробежаться по всей коллекции точно так же как SQL БД пробегаются по таблицам.
$collection->rm($unit);
$collection->set($unit, new Point(2,3));
$collection->move($unitKey, new Point(2,3));
// или
$unit->move(new Point(2,3));
Но на этапе анализа вылез подводный камень — foreach() неадекватно реагирует на ключ в виде объекта.
Отсутствие возможности построить ассоциативный массив, где ключами будут объекты.странное желание. Мне всегда казалось что у массива/«хеш массива» должна быть одна функция: быстрое извлечение данных по ключу.
...the leading backslash is unnecessary and not recommended, as import names must be fully qualified, and are not processed relative to the current namespace.
use UnexpectedValueException
try {
$objectArray = $objectMap->toArray();
} catch (\UnexpectedValueException $exc) {
echo 'Объекты не могут являться ключами массива.';
}
Самостоятельный контроль типов объектов в массиве.
Самостоятельный контроль последовательности индексов в списке.
Отсутствие возможности построить ассоциативный массив, где ключами будут объекты.
public function getHash($value)
{
if (is_object($value)) {
return spl_object_hash($value);
}
if (is_string($value)) {
return md5($value);
}
if (is_array($value)) {
$value = serialize($value);
}
return md5($value);
}
Наследуйте карту и реализуйте getHash()
Есть только небольшой вопрос: что будет, если не преобразовывать в md5 достаточно длинную строку? Например, в несколько десятков килобайт? Если это не страшно, то действительно есть смысл переделать.
Более элегантного способа не нашел. Предложите что-нибудь?
Коллекции объектов в PHP