Par exemple:
$product = new Product("cat");
if(isset($sales[$product])){
$sales[$product]++;
}
else{
$sales[$product] = 1;
}
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;
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.
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
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é.
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
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.