Могу ли я использовать экземпляр объекта в качестве ключа массива? - PullRequest
30 голосов
/ 10 января 2011

Например:

$product = new Product("cat");

if(isset($sales[$product])){
     $sales[$product]++;
}
else{
     $sales[$product] = 1;
}

Ответы [ 6 ]

45 голосов
/ 10 января 2011

Из документов :

Массивы и объекты нельзя использовать в качестве ключей.Это приведет к предупреждению: Недопустимый тип смещения.

Вы можете присвоить каждому экземпляру уникальный идентификатор или переопределить __toString(), чтобы он возвращал что-то уникальное и делал, например,

$array[(string) $instance] = 42;
22 голосов
/ 10 января 2011

Вы можете использовать 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);

так что он хорошо сочетается с остальной частью вашего кода.

16 голосов
/ 25 июля 2013

Существует функция spl_object_hash для получения уникального идентификатора объекта в виде строки, которую можно использовать в качестве ключа массива. http://php.net/manual/en/function.spl-object-hash.php

2 голосов
/ 10 января 2011

В качестве ключей массива допускаются только целые числа и строки .Вы можете написать класс, который реализует ArrayAccess , если вам абсолютно необходимы эти функции.

0 голосов
/ 27 сентября 2018

Вы можете иметь два массива:

Array 1 contains the keys:   |  Array 2 contains the values
+--------+-------------+     |  +--------+------------+
| index: | value:      |     |  | index: | value:     |
| 0      | Object(key) |     |  | 0      | sth(value) |
| 1      | Object(key) |     |  | 1      | sth(value) |
+--------+-------------+     |  +--------+------------+

Вы ищете Объект в массиве 1,
затем вы выбираете индекс этого объекта
используйте его как индекс для массива 2 и
=> получить значение

в php коде

public function getValue($ObjectIndexOfYourArray){
  foreach(array1 as $key => $value) {
    if($value == ObjectIndexOfYourArray){
      return array2[$key];
    }
  }
}

Надеюсь, это поможет

0 голосов
/ 15 июля 2016

Если объект представляет собой простые предопределенные классы, созданные с помощью 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;
}

Но имейте в виду, что равенствоИз двух объектов всегда выбор бизнес-модели и должен быть тщательно продуман.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...