Например:
$product = new Product("cat"); if(isset($sales[$product])){ $sales[$product]++; } else{ $sales[$product] = 1; }
Из документов :
Массивы и объекты не могут использоваться в качестве ключей. Это приведет к предупреждению: тип недопустимого смещения.
Вы можете дать каждому экземпляру уникальный идентификатор или переопределить __toString()
таким образом, чтобы он возвращал что-то уникальное и, например,
$array[(string) $instance] = 42;
Существует функция spl_object_hash для получения уникального идентификатора объекта как строки, которая может использоваться как ключ массива. http://php.net/manual/en/function.spl-object-hash.php
Вы можете использовать http://www.php.net/manual/en/class.splobjectstorage.php
$product = new Product("cat"); $sales = new SplObjectStorage(); if(isset($sales[$product])){ $sales[$product]++; } else{ $sales[$product] = 1; }
Это не настоящий массив, но имеет приличное количество функций и синтаксиса, подобных массиву. Однако из-за того, что он является объектом, он ведет себя как несоответствие в php из-за его нечетного поведения foreach и его несовместимости со всеми встроенными функциями массива php. Иногда вам будет полезно преобразовать его в реальный массив через
$arr = iterator_to_array($sales);
поэтому он отлично играет с остальной частью вашей кодовой базы.
В качестве ключей массива допускаются только целые числа и строки . Вы можете написать класс, который реализует ArrayAccess, если вам абсолютно нужна эта функциональность.
Если объект является простым предопределенным классом, созданным с помощью new stdClass()
он может быть допустимым вариантом использования json-представления этого класса с json_encode
.
$product = new stdClass(); $product->brand = "Acme"; $product->name = "Patator 3.14"; $product_key = json_encode($product); if(isset($sales[$product_key])){ $sales[$product_key]++; } else{ $sales[$product_key] = 1; }
Но имейте в виду, что равенство двух объектов всегда является выбором бизнес-модели и должно быть тщательно спроектировано.