PHP-цикл для извлечения каждого экземпляра определенного фрагмента данных из декодированного JSON - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь написать цикл, в котором будут перечислены все uid в данных JSON. uid охватывает две категории (рубашки и брюки). Ниже то, что я имею до сих пор. Любая помощь очень ценится.

Текущий код и JSON

$url = 'http://foothillertech.com/student/webdesign/2018/2018benrud2/projects/retail/data2.json';
$jsonData = file_get_contents($url);
$data = json_decode($jsonData, true);

Я могу получить каждый uid вручную с помощью этого - $data['shirts'][0]['uid'], но я ищу способ перебрать данные, чтобы вернуть все идентификаторы из категории рубашек и брюк.

Спасибо!

Это код, который решил мою проблему.

Спасибо @ Не паникуйте за вашу помощь!

foreach ($data as $item_type => $items) {
    foreach ($items as $item) {
        $uids[] = $item['uid'];
        echo $uids[$i]."<br>";
        $i++;
    }
}

Ответы [ 2 ]

3 голосов
/ 06 марта 2019

Вы можете объединить массивы второго уровня (ключи от рубашек и брюк) и взять из этого столбец uid.

$uids = array_column(array_merge(...array_values($data)), 'uid');

Подробности этого выражения изнутри (PREVIOUS указывает на результат предыдущего шага):

  • array_values($data) преобразует строковые ключи внешнего массива ('рубашки', 'брюки') в числовые
  • array_merge(... PREVIOUS ) объединяет два внутренних массива, передавая ихarray_merge с использованием аргумента распаковка .(Предыдущий шаг array_values необходим, потому что распаковка аргументов не будет работать на массивах со строковыми ключами.)
  • array_column( PREVIOUS , 'uid') берет все значения 'uid' из объединенного массива, созданного предыдущими шагами

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

foreach ($data as $item_type => $items) {
    foreach ($items as $item) {
        $uids[] = $item['uid'];
    }
}
0 голосов
/ 06 марта 2019

Как упомянул @ jon-stirling, вы можете использовать array_column() для извлечения значений из знакового столбца массива.Это делает много других вещей, которые выходят за рамки вашего вопроса.Проверьте это на http://php.net/manual/en/function.array-column.php

Специально для вашего примера следующий код должен дать вам все uid, извлеченные из $data['shirts'].

$url = 'http://foothillertech.com/student/webdesign/2018/2018benrud2/projects/retail/data2.json';
$jsonData = file_get_contents($url);
$data = json_decode($jsonData, true);
$shirtsUids = array_column($data['shirts'], 'uid');
$pantsUids = array_column($data['pants'], 'uid');

// Then you can use $shirtsUids and $pantsUids as you see fit.

Убедитесь, что $ dataВ массиве есть ключ с именем рубашка, иначе у вас будет выдано сообщение об ошибке или предупреждении.

Чтобы избежать возникновения ошибки, я использую оператор объединения Null (??), чтобы неопределенные значения по умолчанию принимались как приемлемые.,Поэтому я буду использовать $data['shirts'] ?? [].Но опять же, убедитесь, что $ data ['shirts'] является массивом.

$url = 'http://foothillertech.com/student/webdesign/2018/2018benrud2/projects/retail/data2.json';
$jsonData = file_get_contents($url);
$data = json_decode($jsonData, true);
$shirtsUids = array_column($data['shirts'] ?? [], 'uid');
$pantsUids = array_column($data['pants'] ?? [], 'uid');

// Then you can use $shirtsUids and $pantsUids as you see fit.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...