Например:
$product = new Product("cat");
if(isset($sales[$product])){
$sales[$product]++;
}
else{
$sales[$product] = 1;
}
Например:
$product = new Product("cat");
if(isset($sales[$product])){
$sales[$product]++;
}
else{
$sales[$product] = 1;
}
Из docs:
Массивы и объекты не могут использоваться в качестве ключей. Это приведет к предупреждению: тип недопустимого смещения.
Вы можете дать каждому экземпляру уникальный идентификатор или переопределить __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;
}
Но имейте в виду, что равенство двух объектов всегда является выбором бизнес-модели и должно быть тщательно спроектировано.