web-dev-qa-db-fra.com

Comment puis-je accéder à un tableau / objet?

J'ai le tableau suivant et quand je fais print_r(array_values($get_user));, je reçois:

Array (
          [0] => 10499478683521864
          [1] => 07/22/1983
          [2] => [email protected]
          [3] => Alan [4] => male
          [5] => Malmsteen
          [6] => https://www.facebook.com  app_scoped_user_id/1049213468352864/
          [7] => stdClass Object (
                   [id] => 102173722491792
                   [name] => Jakarta, Indonesia
          )
          [8] => id_ID
          [9] => El-nino
          [10] => Alan El-nino Malmsteen
          [11] => 7
          [12] => 2015-05-28T04:09:50+0000
          [13] => 1
        ) 

J'ai essayé d'accéder au tableau comme suit:

echo $get_user[0];

Mais cela me montre:

0 non défini

Note:

Je reçois ce tableau à partir de Facebook SDK 4, je ne connais donc pas la structure de tableau d'origine.

Comment puis-je accéder à titre d'exemple à la valeur [email protected] du tableau?

58
Muhamad Yulianto

Pour accéder à un array ou object, vous devez utiliser deux opérateurs différents.

Tableaux

Pour accéder aux éléments d'un tableau, vous devez utiliser [] Ou vous ne le voyez pas souvent, mais vous pouvez aussi utiliser {}.

echo $array[0];
echo $array{0};
//Both are equivalent and interchangeable

Différence entre la déclaration d'un tableau et l'accès à un élément de tableau

Définir un tableau et accéder à un élément de tableau sont deux choses différentes. Alors ne les mélange pas.

Pour définir un tableau, vous pouvez utiliser array() ou pour PHP> = 5.4 []) Et vous affectez/définissez un tableau/élément. en accédant à un élément de tableau avec [] ou {} comme mentionné ci-dessus, vous obtenez la valeur d'un élément de tableau opposé à la définition d'un élément.

//Déclarer un tableau 
 $ arrayA = tableau ( / * Quelques trucs ici * / ); 
 $ arrayB = [ / * Quelques trucs ici * / ]// Seulement pour PHP> = 5.4
 
 //Accéder à un élément de tableau 
 echo $ array[]; 
 echo $ array{}; 

Access array array

Pour accéder à un élément particulier d'un tableau, vous pouvez utiliser n'importe quelle expression à l'intérieur de [] Ou {}, Ce qui donne ensuite la clé à laquelle vous souhaitez accéder:

$ array [(Toute expression)] 

Sachez simplement quelle expression vous utilisez comme clé et comment elle est interprétée par PHP:

echo $ array []; // La clé est un entier; Il accède à l'élément du 0 
 Echo $ array ["0"]; // La clé est un chaîne; Il accède à l'élément du 0 
 Echo $ array ["chaîne"]; // La clé est un chaîne; Il accède à l'élément avec la clé 'chaîne' 
 Echo $ array [CONSTANT]; // La clé est un constant et il est remplacé par la valeur correspondante 
 echo $ array [constant]; // La clé est aussi un constant et pas une chaîne 
 echo $ array [$ anyVariable] // La clé est un variable et il est remplacé par la valeur qui se trouve dans '$ anyVariable' 
 echo $ array [functionXY ()]; // La clé sera le valeur de retour de la fonction 

Accéder au tableau multidimensionnel

Si vous avez plusieurs tableaux l'un dans l'autre, vous avez simplement un tableau multidimensionnel. Pour accéder à un élément de tableau dans un sous-tableau, il vous suffit d'utiliser plusieurs [].

echo $array["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"]
         // ├─────────────┘  ├──────────────┘  ├────────────────────────────┘
         // │                │                 └── 3rd Array dimension;
         // │                └──────────────────── 2d  Array dimension;
         // └───────────────────────────────────── 1st Array dimension;

Objets

Pour accéder à une propriété d'objet, vous devez utiliser ->.

echo $ objet->propriété;

Si vous avez un objet dans un autre objet, il vous suffit d'utiliser plusieurs -> Pour accéder à la propriété de votre objet.

echo $objectA->objectB->property;

Remarque:

  1. Aussi, vous devez faire attention si vous avez un nom de propriété qui n'est pas valide! Donc, pour voir tous les problèmes auxquels vous pouvez faire face avec un nom de propriété invalide, voyez ceci question/réponse . Et surtout celui-ci si vous avez des chiffres au début du nom de la propriété.

  2. Vous pouvez uniquement accéder aux propriétés avec public visibilité en dehors de la classe. Autrement (privé ou protégé), vous avez besoin d'une méthode ou d'une réflexion que vous pouvez utiliser pour obtenir la valeur de la propriété.

Tableaux et objets

Maintenant, si vous avez mélangé des tableaux et des objets, il vous suffit de regarder si vous accédez maintenant à un élément de tableau ou à une propriété d'objet et utilisez l'opérateur correspondant.

//Object
echo $ object-> anotherObject-> propertyArray ["elementOneWithAnObject"] -> property; 
 // ├────────── ├───────────┘ ├──────────────────────┘ ├──────┘ 
 // │ │ │ └── propriété; 
 // │ │ └───────────────────────────── élément de tableau (objet); Utilisation -> Pour accéder à la propriété 'propriété' 
 // │ └───────────────────────────────── ────────── tableau (propriété); Utilisation [] Pour accéder à l'élément de tableau 'elementOneWithAnObject' 
 // └───────────────────────────────── ───────────────────────── propriété (objet); Utilisation -> Pour accéder à la propriété 'propertyArray' 
 // ─────────────────────────────── objet; Utilisation -> Pour accéder à la propriété 'anotherObject' 
 
 
 // Array 
 Echo $ array ["arrayElement"] ["anotherElement"] -> object-> property [ "élément"]; 
 // ├────────────┘ ├──────────────┘ ├── ├──────┘ ├───────┘ 
 // │ │ │ └── élément de tableau; 
 // │ └─────────── propriété (tableau); Utilisation [] Pour accéder à l'élément de tableau 'element' 
 // │ │ └─────────────────── property (object); Utilisation -> Pour accéder à la propriété 'propriété' 
 // │ └───────────────────────────────── Élément de tableau (objet); Utilisation -> Pour accéder à la propriété 'objet' 
 // ──────────────────── élément de tableau (tableau); Utilisation [] Pour accéder à l'élément de tableau 'anotherElement' 
 // ────────────────────────── tableau; Utilisation [] Pour accéder à l'élément de tableau 'arrayElement' 
 

J'espère que cela vous donne une idée approximative de la manière dont vous pouvez accéder aux tableaux et aux objets, lorsqu'ils sont imbriqués les uns dans les autres.

Remarque:

  1. S'il s'appelle un tableau ou un objet, cela dépend de la partie la plus externe de votre variable. Donc [new StdClass] est un tableau même s'il a (imbriqués) à l'intérieur de celui-ci et $object->property = array(); est un objet même s'il contient des tableaux (imbriqués).

    Et si vous n'êtes pas sûr d'avoir un objet ou un tableau, utilisez simplement gettype() .

  1. Ne vous trompez pas si quelqu'un utilise un autre style de codage que vous:

    //Both methods/styles work and access the same data
    echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property;
    echo $object->
            anotherObject
            ->propertyArray
            ["elementOneWithAnObject"]->
            property;
    
    //Both methods/styles work and access the same data
    echo $array["arrayElement"]["anotherElement"]->object->property["element"];
    echo $array["arrayElement"]
         ["anotherElement"]->
             object
       ->property["element"];
    

Tableaux, objets et boucles

Si vous ne souhaitez pas simplement accéder à un seul élément, vous pouvez effectuer une boucle sur votre tableau/objet imbriqué et parcourir les valeurs d'une dimension particulière.

Pour cela, il vous suffit d'accéder à la dimension sur laquelle vous souhaitez effectuer une boucle, puis vous pouvez effectuer une boucle sur toutes les valeurs de cette dimension.

A titre d'exemple, prenons un tableau, mais il pourrait aussi s'agir d'un objet:

Array (
    [data] => Array (
            [0] => stdClass Object (
                    [propertyXY] => 1
                )    
            [1] => stdClass Object (
                    [propertyXY] => 2
                )   
            [2] => stdClass Object (
                    [propertyXY] => 3                   
               )    
        )
)

Si vous passez en boucle sur la première dimension, vous obtiendrez toutes les valeurs de la première dimension:

pour chaque($ tableau comme $ key => $ value) 

Cela signifie ici que dans la première dimension, vous n’auriez qu’un élément avec la clé ($key) data et la valeur ($value):

Array (  //Key: array
    [0] => stdClass Object (
            [propertyXY] => 1
        )
    [1] => stdClass Object (
            [propertyXY] => 2
        )
    [2] => stdClass Object (
            [propertyXY] => 3
        )
)

Si vous passez en boucle sur la deuxième dimension, vous obtiendrez toutes les valeurs de la deuxième dimension:

pour chaque($ array ["data"] comme $ key => $ value) 

Cela signifie ici que dans la deuxième dimension, vous auriez 3 éléments avec les clés ($key) 0, 1, 2 Et les valeurs ($value):

stdClass Object (  //Key: 0
    [propertyXY] => 1
)
stdClass Object (  //Key: 1
    [propertyXY] => 2
)
stdClass Object (  //Key: 2
    [propertyXY] => 3
)

Et avec cela, vous pouvez parcourir toutes les dimensions souhaitées, qu’il s’agisse d’un tableau ou d’un objet.

Analyse var_dump() / print_r() / var_export() sortie

Toutes ces 3 fonctions de débogage génèrent les mêmes données, dans un autre format ou avec des métadonnées (type, taille, par exemple). Donc, ici, je veux montrer comment vous devez lire le résultat de ces fonctions pour savoir/comment accéder à certaines données de votre tableau/objet.

Tableau d'entrée:

$array = [
    "key" => (object) [
        "property" => [1,2,3]
    ]
];

var_dump() sortie:

array(1) {
  ["key"]=>
  object(stdClass)#1 (1) {
    ["property"]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    }
  }
}

print_r() sortie:

Array
(
    [key] => stdClass Object
        (
            [property] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

        )

)

var_export() sortie:

array (
  'key' => 
  stdClass::__set_state(array(
     'property' => 
    array (
      0 => 1,
      1 => 2,
      2 => 3,
    ),
  )),
)

Comme vous pouvez le constater, toutes les sorties sont assez similaires. Et si vous voulez maintenant accéder à la valeur 2, vous pouvez simplement commencer à partir de la valeur elle-même, à laquelle vous souhaitez accéder, puis vous frayer un chemin en "haut à gauche".

1. On voit d’abord que la valeur 2 est dans un tableau avec la clé 1

array (3) {  //var_dump()
 [0] => 
 int (1) 
 [1] => 
 Int (2)
 [2] => 
 Int (3) 
}
Tableau  //print_r()
(
 [0] => 1 
 [1] => 2
 [2] => 3 
)
tableau (  //var_export()
 0 => 1, 
 1 => 2,
 2 => 3, 
),

Cela signifie que nous devons utiliser []/{} Pour accéder à la valeur 2 avec [1], puisque la valeur a la clé/index 1.

2. Ensuite, nous voyons que le tableau est assigné à une propriété avec la propriété name d'un objet

objet(stdClass) # 1 (1) {  //var_dump()
 ["propriété"]=> 
/* Tableau ici */
}
stdClass Objet  //print_r()
([propriété] =>/* Tableau ici */
)
stdClass:: __ set_state(array (//var_export()
 'propriété' => 
/* Tableau ici */
)),

Cela signifie que nous devons utiliser -> Pour accéder à la propriété de l'objet, par exemple. ->property.

Donc, jusqu'à présent, nous savons qu'il faut utiliser ->property[1].

3. Et à la fin, nous voyons que le plus extérieur est un tableau

tableau (1) {  //var_dump()
 ["clé"]=> 
/* Objet et tableau ici */
}
Tableau  //print_r()
([clé] => 
/* Objet et tableau ici */
)
tableau (  //var_export()
 'clé' => 
/* Objet et tableau ici */
)

Comme nous savons que nous devons accéder à un élément de tableau avec [], Nous voyons ici que nous devons utiliser ["key"] pour accéder à l'objet. Nous pouvons maintenant rassembler toutes ces parties et écrire:

echo $array["key"]->property[1];

Et le résultat sera:

2

Ne laissez pas PHP vous traîner!

Il y a quelques choses que vous devez savoir pour ne pas passer des heures à les trouver.

  1. Caractères "cachés"

    Parfois, vous avez des caractères dans vos clés, que vous ne voyez pas au premier regard dans le navigateur. Et ensuite, vous vous demandez pourquoi vous ne pouvez pas accéder à l'élément. Ces caractères peuvent être: des tabulations (\t), De nouvelles lignes (\n), Des espaces ou des balises HTML (par exemple </p>, <b>), Etc.

    Par exemple, si vous regardez le résultat de print_r() et que vous voyez:

    Array ( [key] => HERE ) 
    

    Ensuite, vous essayez d'accéder à l'élément avec:

    echo $arr["key"];
    

    Mais vous recevez la notification:

    Avis: index non défini: clé

    C'est une bonne indication qu'il doit y avoir des caractères cachés, car vous ne pouvez pas accéder à l'élément, même si les clés semblent assez correctes.

    Le truc ici consiste à utiliser var_dump() + dans votre code source! (Alternative: highlight_string(print_r($variable, TRUE));)

    Et tout à coup, vous verrez peut-être des choses comme celle-ci:

    array(1) {
      ["</b>
    key"]=>
      string(4) "HERE"
    }
    

    Vous verrez maintenant que votre clé contient une balise html + un caractère de nouvelle ligne que vous n'avez pas vu en premier lieu, car print_r() et le navigateur ne l'ont pas montré.

    Alors maintenant, si vous essayez de faire:

    echo $arr["</b>\nkey"];
    

    Vous obtiendrez votre sortie désirée:

    HERE
    
  2. Ne faites jamais confiance à la sortie de print_r() ou var_dump() si vous regardez XML

    Vous pourriez avoir un fichier XML ou une chaîne chargée dans un objet, par exemple.

    <?xml version="1.0" encoding="UTF-8" ?> 
    <rss> 
        <item> 
            <title attribute="xy" ab="xy">test</title> 
        </item> 
    </rss>
    

    Maintenant, si vous utilisez var_dump() ou print_r(), vous verrez:

    SimpleXMLElement Object
    (
        [item] => SimpleXMLElement Object
        (
            [title] => test
        )
    
    )
    

    Donc, comme vous pouvez le voir, vous ne voyez pas les attributs du titre. Donc, comme je l'ai dit, ne faites jamais confiance à la sortie de var_dump() ou print_r() lorsque vous avez un objet XML. Utilisez toujours asXML() pour voir le fichier XML complet/la chaîne.

    Utilisez donc l’une des méthodes présentées ci-dessous:

    echo $xml->asXML();  //And look into the source code
    
    highlight_string($xml->asXML());
    
    header ("Content-Type:text/xml");
    echo $xml->asXML();
    

    Et ensuite, vous obtiendrez le résultat:

    <?xml version="1.0" encoding="UTF-8"?>
    <rss> 
        <item> 
            <title attribute="xy" ab="xy">test</title> 
        </item> 
    </rss>
    

Pour plus d'informations, voir:

Général (symboles, erreurs)

Problèmes de nom de propriété

91
Rizier123

De la question, nous ne pouvons pas voir la structure du tableau d'entrée. C'est peut-être array ('id' => 10499478683521864, 'date' => '07/22/1983'). Ainsi, lorsque vous demandez à $ demo [0], vous utilisez l’index undefind.

Array_values ​​a perdu des clés et a retourné un tableau contenant de nombreuses clés, ce qui a fait que tableau était appelé array(10499478683521864, '07/22/1983'...). Ce résultat, nous voyons dans la question.

Donc, vous pouvez prendre les valeurs d'un élément de tableau de la même manière

echo array_values($get_user)[0]; // 10499478683521864 
8
splash58

Si votre sortie de print_r($var) est par exemple:

    Array ( [demo] => Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] ) )

puis faites $var['demo'][0]

Si le résultat de print_r($var) est par exemple:

    Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] )

puis faites $var[0]

2
Evans Murithi