2010-01-07 6 views
2

est-il possible de faire fonctionner les objets stdClass comme un tableau indexé génériquement?Puis-je utiliser stdClass comme un tableau?

ie $ array = Array ( [0] => 120 [1] => 382 [2] => 552 [3] => 595 [4] => 616 )

serait construit comme

$a = array(); 
$array[] = 120; 
$array[] = 382; 

etc.

mais si je le fais avec un objet, il suffit écraser s lui-même:

$obj = new stdClass; 
$obj->a = 120; 
$obj->a = 382; 

je sais que je peux changer « a » chaque fois,

désolé si cela est une question stupide, mais il me dessouchage pour une raison!

Appréciez toute aide :)

Dan

+3

Vous voulez juste pousser un champ sur un objet? Cela n'a pas de sens. Utilisez un tableau. – meagar

+0

Il semble que l'affiche d'origine souhaite un objet auquel vous pouvez assigner des propriétés, mais alson a un tableau intégré. –

Répondre

5

En bref, non, parce que vous aurez toujours le nom de vos propriétés. Traiter la difficulté d'écrire une classe simple avec ArrayAccess n'a aucun sens non plus car vous avez essentiellement recréé un tableau sans rien pour le montrer sauf des sacrifices extrêmes dans la performance et la transparence.

Y at-il quelque raison que votre problème ne peut être résolu infiniment plus simplement à l'aide d'un tableau, ou est-ce juste un souhait-je-savais question?

EDIT: Consultez this question pour plus d'informations.

+0

Je pense que ça pourrait être ça. C'est un souhait que je connaissais: je sais que je pourrais utiliser un tableau, mais pour moi, utiliser simplement des objets stdClass est plus pratique que d'utiliser des tableaux et des objets stdClass pour l'instance où je veux utiliser des objets dans des tableaux. – significance

0

seulement pour la POO, ne pas utiliser des classes. Si vous voulez vraiment implémenter cette fonctionnalité, utilisez cette classe:

class ArrayClass 
{ 
    protected $storage = array(); 

    public function push($content) { 
     $this->storage[] = $content; 
     return $this; 
    } 

    public function get($index) { 
     if (isset($this->storage[$index])) { 
      return $this->storage[$index]; 
     } else { 
      //throw an error or 
      return false; 
     } 
    } 
} 
+1

Je suggérerais d'utiliser array_key_exists au lieu de isset, car isset retournera false si la valeur est null. – Dereleased

1

Je ne peux pas vraiment voir ce que vous entendez faire, peu de

<?php 
$obj->a = array(); 
$obj->a[] = 120; 
$obj->a[] = 382; 
// ... 
?> 

Vous ne pouvez pas simplement « pousser » un champ sur un objet. Vous devez connaître le nom du champ afin de récupérer la valeur de toute façon, donc c'est à peu près un non-sens.

1

Un objet n'est pas un tableau. Si vous voulez des éléments indexés numériquement, utilisez un tableau.

Si vous souhaitez des éléments nommés utilisent soit un objet ou un tableau Associatif.

Quant à savoir pourquoi vous obtenez un comportement différent, il est parce que dans le tableau, vous ne spécifiez pas un index, PHP utilise la longueur du tableau comme l'indice. Avec l'objet, vous devez spécifier le nom (dans ce cas 'a').

L'autre chose que vous pouvez faire est d'avoir un objet, avec un membre qui est un tableau:

$obj = new stdClass; 
$obj->arr = array(); 
$obj->arr[] = 'foo'; 
$obj->arr[] = 'bar'; 

aussi ne pas oublier que vous pouvez jeter un tableau à un objet:

$obj = (object) array(
    'arr' => array(
     'foo', 
     'bar' 
    ) 
); 
3

Non, vous ne pouvez pas. L'utilisation des parenthèses ([]) comme cela s'appelle "ArrayAccess" en PHP, et n'est pas implémentée sur l'objet stdClass.

On dirait que vous pourriez voulez quelque chose comme

$foo = new stdClass(); 
$foo->items = array(); 
$foo->items[] = 'abc'; 
$foo->items[] = '123'; 
$foo->items[] = 'you and me'; 

Vous pouvez également essayer de jeter un tableau comme stdClass pour voir ce qui se passe.

$foo = array(); 
$foo[] = 'abc'; 
$foo[] = '123'; 
$foo[] = 'you and me'; 
$foo = (object) $foo; 
var_dump($foo); 
+0

Cela arrive: http://stackoverflow.com/questions/1869812/casing-an-array-with-numeric-keys-as-an-object – Dereleased

+1

Je sais, regardez qui a posé cette question. –

+1

regardez qui a répondu. –

0

Vous pouvez obtenir exactement ceci en JavaScript.

Questions connexes