Массивы PHP, может быть, кто-то может помочь объяснить - PullRequest
0 голосов
/ 23 ноября 2010

Итак, вот часть массива, с которой я пытаюсь работать, она извлечена из файла XML.

Array
(
    [0] => Array
        (
            [SKU] => 0016
            [StandardProductID] => 32109876453210
            [Condition] => NEW
            [ItemPackageQuantity] => 1
            [Currency] => GBP
            [StandardPrice] => 5.00
            [DescriptionData] => Array
                (
                    [Title] => Product Title
                    [Brand] => Franks
                    [Ingredients] => Array
                        (
                            [Ingredient] => Array
                                (
                                    [0] => Water (Aqua)
                                    [1] => Dicetyldimonium Chloride
                                )

                        )

Я выяснил, что могу получить доступ к первому столбцу массива.с этим: $ Details = std_class_object_to_array ($ xml);

foreach ($Details[product] as $Detail) {

 if (strtoupper(trim(!empty($Detail[SKU])))) {
  $SKU = (strtoupper(trim($Detail[SKU])));
  echo $SKU;
 }
}

Но как мне получить доступ к другим столбцам, DescriptionData / Title и DescriptionData / Ingredients / Ingredient.Может кто-нибудь собрать или указать мне правильное направление для работы с различными уровнями в массиве?

Большое спасибо заранее

Ответы [ 5 ]

5 голосов
/ 23 ноября 2010

Первая точка - ключи массива должны быть адресованы в виде строки:

// good:
$Details['product']

// bad:
$Details[product]

Теперь к вашему вопросу:

Вложенные массивы адресуются только с использованием нескольких квадратных скобок:

echo $Detail['DescriptionData']['Ingredients']['Ingredient'][0]; // "Water (Aqua)"
3 голосов
/ 23 ноября 2010
$title = $Detail['DescriptionData']['Title'];
$brand = $Detail['DescriptionData']['Brand'];
$ingredients = $Detail['DescriptionData']['Ingredients']['Ingredient']; //sets it to the array
//etc...
1 голос
/ 23 ноября 2010

Я считаю, что ваша foreach петля настроена неправильно. Предполагая, что $Details определен как массив, который вы показали выше:

foreach ($Details as $Detail) {
 echo $Detail['SKU'];
 echo $Detail['DescriptionData'];
 echo $Detail['DescriptionData']['Title'];
}
0 голосов
/ 23 ноября 2010

В PHP массивы действительно больше похожи на «карты» или «ассоциативные массивы» в зависимости от того, какой термин вы хотите использовать.Они также могут следовать правилам обычного числового индексированного простого массива, что делает его еще более запутанным, когда он смешивается и сопоставляется, но это не проблема.

При доступе к массиву помните, что каждый элементможет содержать свой собственный массив.Когда вы используете оператор [], вы получаете элемент в этом месте, а затем можете работать непосредственно после этого для вызова функций-членов или дальнейшего доступа к элементам вложенного массива.

Это означает, что $ Details ['DescriptionData'] вернетмассив, и поскольку массивы могут обращаться к элементам с помощью [], мы можем затем связать другой доступ после этого: $ Details ['DescriptionData'] ['Ingredients'], который снова возвращает массив, чтобы мы могли в дальнейшем связать $ Details ['DescriptionData'] ['Ingredients'] ['Ingredient'], и это еще один массив, поэтому мы можем связать еще раз:

$ Details ['DescriptionData'] ['Ingredients'] ['Ingredient'] [0], который возвращаетstring "Water (Aqua)"

Строки могут также обращаться к отдельным символам с помощью оператора [], поэтому мы можем получить второй символ в Water, выполнив:
$ Details ['DescriptionData'] ['Ingredients'] [' Ingredient '] [0] [1] ===' a '

И если бы мы обращались к объекту внутри массива, вы могли бы сделать что-то вроде $ Array [' Index '] -> memberFunction();Если memberFunction вернул массив, вы можете получить такие вещи, как:
$ Array ['Index'] -> memberFunction () ['ReturnedArrayIndex'];Потому что каждый доступ работает с возвращаемым значением вещи слева от него.

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

0 голосов
/ 23 ноября 2010
echo $Detail['DescriptionData']['Title'];
foreach ($Detail['DescriptionData']['Ingredients']['Ingredient'] as $ingredient) {
  echo $ingredient;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...