Подтвердить что ты не робот

Как я могу получить доступ к массиву/объекту?

У меня есть следующий массив, и когда я делаю print_r(array_values($get_user)); , Я получил:

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
        ) 

Я попытался получить доступ к массиву следующим образом:

echo $get_user[0];

Но это показывает мне:

не определено 0

Замечания:

Я получил этот массив из Facebook SDK 4, поэтому я не знаю исходную структуру массива.

Как я могу получить в качестве примера значение [email protected] из массива?

4b9b3361

Ответ 1

Чтобы получить доступ к array или object, как использовать два разных оператора.

Массивы

Чтобы получить доступ к элементам массива, вы должны использовать либо [], или которые вы не так много видите, но вы также можете использовать {}.

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

Разница между объявлением массива и доступом к элементу массива

Определение массива и доступ к элементу массива - это две разные вещи. Так что не смешивайте их.

Чтобы определить массив, вы можете использовать array() или для PHP >= 5.4 [], и вы назначаете/устанавливаете массив/-элемент. Когда вы получаете доступ к элементу массива с помощью [] или {}, как указано выше, вы получаете значение элемента массива, противоположное заданию элемента.

//Declaring an array
$arrayA = array ( /*Some stuff in here*/ );
$arrayB = [ /*Some stuff in here*/ ]; //Only for PHP >=5.4

//Accessing an array element
echo $array[0];
echo $array{0};

Элемент массива доступа

Чтобы получить доступ к определенному элементу в массиве, вы можете использовать любое выражение внутри [] или {}, которое затем оценивает ключ, к которому вы хотите получить доступ:

$array[(Any expression)]

Поэтому просто знайте, какое выражение вы используете в качестве ключа и как оно интерпретируется PHP:

echo $array[0];            //The key is an integer; It accesses the 0 element
echo $array["0"];          //The key is a string; It accesses the 0 element
echo $array["string"];     //The key is a string; It accesses the element with the key 'string'
echo $array[CONSTANT];     //The key is a constant and it gets replaced with the corresponding value
echo $array[cOnStAnT];     //The key is also a constant and not a string
echo $array[$anyVariable]  //The key is a variable and it gets replaced with the value which is in '$anyVariable'
echo $array[functionXY()]; //The key will be the return value of the function

Доступ к многомерному массиву

Если у вас несколько массивов друг в друге, у вас просто есть многомерный массив. Чтобы получить доступ к элементу массива в дополнительном массиве, вам просто нужно использовать несколько [].

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

Объекты

Чтобы получить доступ к свойству объекта, вы должны использовать ->.

echo $object->property;

Если у вас есть объект в другом объекте, вам просто нужно использовать несколько -> для доступа к свойству объекта.

echo $objectA->objectB->property;

Примечание:

  • Также вы должны быть осторожны, если у вас есть недопустимое имя свойства! Поэтому, чтобы увидеть все проблемы, с которыми вы можете столкнуться с недопустимым именем свойства, см. Этот вопрос . И особенно этот, если у вас есть номера в начале имени свойства.

  • Вы можете обращаться к свойствам с общедоступными visibility вне класса. В противном случае (частный или защищенный) вам нужен метод или отражение, которое вы можете использовать для получения значения свойства.

Массивы и объекты

Теперь, если у вас есть массивы и объекты, смешанные друг с другом, вам просто нужно посмотреть, можете ли вы теперь получить доступ к элементу массива или его объекту и использовать для него соответствующий оператор.

//Object
echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property;
    //├────┘  ├───────────┘  ├───────────┘ ├──────────────────────┘   ├──────┘
    //│       │              │             │                          └── property ; 
    //│       │              │             └───────────────────────────── array element (object) ; Use -> To access the property 'property'
    //│       │              └─────────────────────────────────────────── array (property) ; Use [] To access the array element 'elementOneWithAnObject'
    //│       └────────────────────────────────────────────────────────── property (object) ; Use -> To access the property 'propertyArray'
    //└────────────────────────────────────────────────────────────────── object ; Use -> To access the property 'anotherObject'


//Array
echo $array["arrayElement"]["anotherElement"]->object->property["element"];
    //├───┘ ├────────────┘  ├──────────────┘   ├────┘  ├──────┘ ├───────┘
    //│     │               │                  │       │        └── array element ; 
    //│     │               │                  │       └─────────── property (array) ; Use [] To access the array element 'element'
    //│     │               │                  └─────────────────── property (object) ; Use -> To access the property 'property'
    //│     │               └────────────────────────────────────── array element (object) ; Use -> To access the property 'object'
    //│     └────────────────────────────────────────────────────── array element (array) ; Use [] To access the array element 'anotherElement'
    //└──────────────────────────────────────────────────────────── array ; Use [] To access the array element 'arrayElement'

Надеюсь, это даст вам общее представление о том, как вы можете обращаться к массивам и объектам, когда они вложены друг в друга.

Примечание:

  • Если он называется массивом или объектом, зависит от самой внешней части вашей переменной. Таким образом [new StdClass] является массивом , даже если внутри него есть (вложенные) объекты, а $object->property = array(); - объект /strong > , даже если внутри него есть (вложенные) массивы.

    И если вы не уверены, что у вас есть объект или массив, просто используйте gettype().

  1. Не смущайтесь, если кто-то использует другой стиль кодирования, чем вы:

    //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"];
    

Массивы, объекты и циклы

Если вы не просто хотите получить доступ к одному элементу, вы можете перебрать свой вложенный массив/объект и пройти через значения определенного измерения.

Для этого вам просто нужно получить доступ к размеру, по которому вы хотите выполнить цикл, а затем вы можете перебрать все значения этого измерения.

В качестве примера возьмем массив, но он также может быть объектом:

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

Если вы зацикливаете первое измерение, вы получите все значения из первого измерения:

foreach($array as $key => $value)

Значит, здесь в первом измерении у вас будет только 1 элемент с ключом ($key) data и значением ($value):

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

Если вы зацикливаете второе измерение, вы получите все значения из второго измерения:

foreach($array["data"] as $key => $value)

Значит, во втором измерении у вас будет 3 элемента с ключами ($key) 0, 1, 2 и значения ($value):

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

И с этим вы можете прокручивать любое измерение, которое вы хотите, независимо от того, является ли это массивом или объектом.

Анализ var_dump()/print_r()/var_export() output

Все эти три функции отладки выводят одни и те же данные только в другом формате или с некоторыми метаданными (например, тип, размер). Поэтому здесь я хочу показать, как вам нужно читать выходные данные этих функций, чтобы узнать/узнать, как получить доступ к определенным данным из вашего массива/объекта.

Входной массив:

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

var_dump() вывод:

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

print_r() вывод:

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

        )

)

var_export() вывод:

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

Итак, вы можете видеть, что все выходы очень похожи. И если теперь вы хотите получить доступ к значению 2, вы можете просто начать с самого значения, к которому вы хотите получить доступ, и выйти из него в "верхний левый".

1. Сначала мы видим, что значение 2 находится в массиве с ключом 1

array(3) {  //var_dump()
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Array  //print_r()
(
  [0] => 1
  [1] => 2
  [2] => 3
)

array (  //var_export()
  0 => 1,
  1 => 2,
  2 => 3,
),

Это означает, что мы должны использовать []/{} для доступа к значению 2 с помощью [1], поскольку значение имеет ключ/индекс 1.

2. Далее мы видим, что массив присваивается свойству с свойством name объекта

object(stdClass)#1 (1) {  //var_dump()
  ["property"]=>
    /* Array here */
}

stdClass Object  //print_r()
(
  [property] => /* Array here */
)

stdClass::__set_state(array(  //var_export()
  'property' => 
    /* Array here */
)),

Это означает, что мы должны использовать -> для доступа к свойству объекта, например. ->property.

Итак, до сих пор мы знаем, что мы должны использовать ->property[1].

3. И в конце мы видим, что самым внешним является массив

array(1) {  //var_dump()
  ["key"]=>
    /* Object & Array here */
}

Array  //print_r()
(
  [key] => 
    /* Object & Array here */
)

array (  //var_export()
  'key' =>
    /* Object & Array here */
)

Как мы знаем, нам нужно получить доступ к элементу массива с помощью [], здесь мы видим, что для доступа к объекту мы должны использовать ["key"]. Теперь мы можем собрать все эти части и написать:

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

И выход будет:

2

Не позволяйте PHP троллировать вас!

Есть несколько вещей, которые вы должны знать, чтобы вы не тратили на это время на поиск их.

  • "Скрытые" символы

    Иногда у вас есть символы в ваших ключах, которые вы не видите при первом взгляде в браузере. И тогда вы спрашиваете себя, почему вы не можете получить доступ к элементу. Этими символами могут быть: вкладки (\t), новые строки (\n), пробелы или теги html (например, </p>, <b>) и т.д.

    В качестве примера, если вы посмотрите на вывод print_r(), и вы увидите:

    Array ( [key] => HERE ) 
    

    Затем вы пытаетесь получить доступ к элементу с помощью:

    echo $arr["key"];
    

    Но вы получаете уведомление:

    Примечание: Undefined index: key

    Это хороший признак того, что должны быть скрытые символы, так как вы не можете получить доступ к элементу, даже если клавиши выглядят довольно корректно.

    Трюк здесь - использовать var_dump() + посмотреть в свой исходный код! (Альтернатива: highlight_string(print_r($variable, TRUE));)

    И внезапно вы, возможно, увидите такие вещи:

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

    Теперь вы увидите, что ваш ключ имеет в нем тэг html + новый символ строки, который вы не видели в первую очередь, поскольку print_r() и браузер не показали этого.

    Итак, если вы попытаетесь сделать:

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

    Вы получите желаемый результат:

    HERE
    
  • Никогда не доверяйте выводам print_r() или var_dump(), если вы посмотрите на XML

    У вас может быть XML файл или строка, загружаемая в объект, например

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

    Теперь, если вы используете var_dump() или print_r(), вы увидите:

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

    Итак, вы видите, что вы не видите атрибуты заголовка. Поэтому, как я сказал, никогда не доверяют выводам var_dump() или print_r(), когда у вас есть объект XML. Всегда используйте asXML(), чтобы увидеть полный XML файл/строку.

    Поэтому просто используйте один из методов, показанных ниже:

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

    И тогда вы получите результат:

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

Для получения дополнительной информации см.

Общие (символы, ошибки)

Проблемы с именами имен

Ответ 2

Из вопроса мы не можем видеть структуру входного массива. Это может быть array ('id' => 10499478683521864, 'date' => '07/22/1983'). Поэтому, когда вы запрашиваете $demo [0], вы используете индекс undefind.

Array_values ​​потерял ключи и возвращает массив с многочисленными клавишами, создающими массив как array(10499478683521864, '07/22/1983'...). Этот результат мы видим в вопросе.

Итак, вы можете взять значения элемента массива тем же способом

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

Ответ 3

Если ваш вывод из print_r($var) равен, например:

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

то do $var['demo'][0]

Если выход из print_r($var) равен, например:

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

то do $var[0]

Ответ 4

вы можете использовать

$ar = (array) $get_user;

тогда вы можете получить доступ к своим индексам:

echo $ar[0];