Puis-je utiliser un objet instancié comme clé de tableau?

Par exemple:

$product = new Product("cat");

if(isset($sales[$product])){
     $sales[$product]++;
}
else{
     $sales[$product] = 1;
}
28
demandé sur Felix Kling 2011-01-10 04:20:43

6 réponses

À partir des documents :

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 donner à chaque instance un identifiant unique ou remplacer __toString() tel qu'il renvoie quelque chose d'unique et fait par exemple

$array[(string) $instance] = 42;
42
répondu Felix Kling 2011-01-10 01:32:58

Vous pouvez utiliser 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;
}

Ce n'est pas un vrai tableau, mais a une quantité décente de fonctionnalités et de syntaxe de type tableau. Cependant, étant donné qu'il s'agit d'un objet, il se comporte comme un misfit en php en raison de son comportement foreach étrange, et de son incompatibilité avec toutes les fonctions de tableau PHP natives. Parfois, vous trouverez utile de le convertir en un tableau réel via

$arr = iterator_to_array($sales);

Donc, il joue bien avec le reste de votre base de code.

16
répondu goat 2015-01-30 04:31:20

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

14
répondu Tomáš Binek 2013-07-25 09:31:44

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
répondu Oswald 2011-01-10 01:25:05

Si l'objet est une simple classes prédéfinies fait avec new stdClass(), il peut être une option valide pour 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 d'affaires et doit être soigneusement conçu.

0
répondu Gabriel Glenn 2016-07-15 09:26:26

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,
ensuite, vous choisissez l'index de cet objet
utilisez - le comme index pour le tableau 2 et
= > récupère la valeur

Dans le code php

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

J'espère que ça aide

0
répondu Jannis 2018-09-27 11:24:20