web-dev-qa-db-fra.com

Puis-je utiliser un objet instancié en tant que clé de tableau?

Par exemple:

$product = new Product("cat");

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

De la docs :

Les tableaux et les objets ne peuvent pas être utilisés comme clés. Cela entraînera un avertissement: type de décalage illégal.

Vous pouvez attribuer à chaque instance un ID unique ou remplacer __toString() de telle sorte qu'elle renvoie quelque chose d'unique et le ferait par exemple.

$array[(string) $instance] = 42;
44
Felix Kling

Vous pouvez utiliser http://www.php.net/manual/fr/class.splobjectstorage.php

$product = new Product("cat");
$sales = new SplObjectStorage();
if(isset($sales[$product])){
     $sales[$product]++;
}
else{
     $sales[$product] = 1;
}

Ce n'est pas un vrai tableau, mais a une quantité décente de fonctionnalités et de syntaxe semblables à celles d'un tableau. Cependant, étant donné qu’il s’agit d’un objet, il se comporte comme un inadapté dans php en raison de son comportement étrange foreach et de son incompatibilité avec toutes les fonctions de tableau php natif. Parfois, vous trouverez utile de le convertir en un vrai tableau via

$arr = iterator_to_array($sales);

il joue donc bien avec le reste de votre base de code.

19
goat

Il existe une fonction spl_object_hash pour obtenir l'identifiant d'objet unique sous forme de chaîne, qui peut être utilisée comme clé de tableau. http://php.net/manual/en/function.spl-object-hash.php

15
Tomáš Binek

Seuls les entiers et les chaînes sont autorisés en tant que clés de tableau . Vous pouvez écrire une classe qui implémente ArrayAccess si vous avez absolument besoin de cette fonctionnalité.

2
Oswald

Vous pourriez avoir deux tableaux:

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) |
+--------+-------------+     |  +--------+------------+

Vous recherchez l'objet dans le tableau 1,
alors vous choisissez l'index de cet objet
l’utiliser comme index pour le tableau 2 et
=> obtenir la valeur

en code php

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

J'espère que ça aide

0
Jannis

Si l'objet est une simple classe prédéfinie faite avec new stdClass(), il peut être valide d'utiliser la représentation json de cette classe avec 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;
}

Mais gardez à l'esprit que l'égalité de deux objets est toujours un choix de modèle commercial et doit être soigneusement conçue.

0
Gabriel Glenn