Практически ничего не стоит написать в чатах PHP или документации php, которая будет вам полезна, Адам.Большинство предложений имеют тенденцию к реализации interface ArrayAccess
или расширению class ArrayObject
, оба в SPL.Фактически, существует удивительно простое решение вашей проблемы: $post->comments[0]['uid']=3
с использованием перегруженного сеттера __set()
.
Определение private $comments = array();
в классе post
.Для удобства используйте текстовый ключ для первого нижнего индекса $comments
: здесь целое число 0 становится, скажем, «нулем».Затем вы вызываете установщик следующим образом:
$post->zero = ['uid', 3];
Это вызывает магический установщик, потому что в классе post
публично не объявлено свойство $zero
: «Методы перегрузки вызываются при взаимодействии со свойствами или методамикоторые не были объявлены или не видны в текущей области. "(Страница справочника PHP 5 на Перегрузка .)
Установщик также может быть setComments()
, что удобно, потому что вам не придется различать входящие свойства, чтобы идентифицировать те, которые предназначены для массива comments
, но синтаксис вызова становится менее естественным.
Ваша перегруженная автомагическая функция __set
получает два аргумента: свойство и значение:
public function __set($property, $value) {
, очень напоминающее КрокфордаПротокол JSON.Полезно думать об этом в этих терминах.
Поскольку отправленное вами свойство "ноль" не существует в классе post
, его необходимо перехватить, и мой предпочтительный метод, начиная с первого индексав свойстве comments
, скорее всего, будет иметь несколько значений, для определения частного массива поддерживаемых значений нижнего индекса в post
:
private $indices = [
"zero" => 0,
"one" => 1,
"two" => 2,
"three" => 3
];
Когда индекс для comments
поступает в __set()
как $property
подтверждено существование в $indices
.Теперь вы просто перебираете массив, предоставленный в $value
, извлекаете uid
и соответствующее ему значение, а затем присваиваете $comments
следующим образом:
public function __set($property, $value) {
if (array_key_exists($property, $this->indices) && is_array($value))
foreach ($value as $uid => $uid_value)
$this->comments[$this->indices[property]][$uid] = $uid_value;
else
...
}
с использованием $this->indices[property]
для извлечения целого числазначение 0, которое будет использоваться для индексации первого измерения comments
, и $uid_value
, извлеченное со значением присваиваемого значения int 3.
Подход, описанный здесь, не является уловкой, обходным решением или умным приемом.Это простая методика проектирования, предназначенная для работы с одним из средств SPL, и, в принципе, ее можно распространить на массивы произвольного измерения.У меня есть проект, реализованный в производственной системе, поэтому, если у вас все еще есть проблемы, напишите здесь, и я помогу вам отладить ваше приложение.Желаем удачи!