web-dev-qa-db-fra.com

En PHP, comment puis-je ajouter un élément d'objet à un tableau?

J'utilise PHP. J'ai un tableau d'objets et j'aimerais ajouter un objet à la fin de celui-ci.

$myArray[] = null; //adds an element
$myArray[count($myArray) - 1]->name = "my name"; //modifies the element I just added

Ce qui précède est fonctionnel, mais existe-t-il un moyen plus propre et plus lisible de l'écrire? Peut-être une ligne?

21
adamdport

Il suffit de faire:

$object = new stdClass();
$object->name = "My name";
$myArray[] = $object;

Vous devez d'abord créer l'objet (la ligne new), puis le placer à la fin du tableau (la ligne []).

Vous pouvez aussi faire ceci:

$myArray[] = (object) array('name' => 'My name');

Cependant, je dirais que ce n'est pas aussi lisible, même si c'est plus succinct.

63
halfer

Avez-vous vraiment besoin d'un objet? Qu'en est-il de:

$myArray[] = array("name" => "my name");

Il suffit d'utiliser un tableau à deux dimensions. 

Sortie (var_dump):

array(1) {
  [0]=>
  array(1) {
    ["name"]=>
    string(7) "my name"
  }
}

Vous pouvez accéder à votre dernière entrée comme ceci:

echo $myArray[count($myArray) - 1]["name"];
5
Frederik Kammer

Quelque chose comme:

class TestClass {
private $var1;
private $var2;

private function TestClass($var1, $var2){
    $this->var1 = $var1;
    $this->var2 = $var2;
}

public static function create($var1, $var2){
    if (is_numeric($var1)){
        return new TestClass($var1, $var2);
    }
    else return NULL;
}
}

$myArray = array();
$myArray[] = TestClass::create(15, "asdf");
$myArray[] = TestClass::create(20, "asdfa");
$myArray[] = TestClass::create("a", "abcd");

print_r($myArray);

$myArray = array_filter($myArray, function($e){ return !is_null($e);});

print_r($myArray);

Je pense qu'il y a des situations où ces constructions sont préférables aux tableaux. Vous pouvez déplacer toute la logique de vérification dans la classe.

Ici, avant l'appel à array_filter $ myArray a 3 éléments. Deux objets corrects et un NULL. Après l'appel, seuls les 2 éléments corrects persistent.

2
Moisés Márquez

Voici une autre méthode propre que j'ai découverte si vous avez plusieurs enregistrements dans une foreach:

$foo = [];

array_Push($foo, (object)[
        'key1' => 'fooValue'
        'key2' => 'fooValue2'
        'key3' => 'fooValue3'
]);

return $foo;
0
hinteractive02