Я беру библиографические данные через API (zotero.org), и он похож на образец внизу (только более сложный образец).
Я хочу получить одну или несколько записей и отобразить определенные значения на странице. Например, я хотел бы прокрутить каждую запись верхнего уровня и распечатать данные в красиво сформированной цитате. Игнорируя правильные стили стилей на данный момент, скажем, я хочу просто распечатать следующее для каждой возвращенной записи:
имя автора, имя автора2, название статьи, название публикации, ключ
Это не соответствует коду, потому что я явно неправильно ссылаюсь на пары значений и просто создаю беспорядок.
Следующее выложено, как данные, если я запрашиваю формат JSON, хотя я могу запросить данные XML вместо этого. Я не придирчива; Я пробовал использовать их без везения.
[ { "key": "123456", "state": 100, "data": { "articleTitle": "Wombat coprogenetics: enumerating a common wombat population by microsatellite analysis of faecal DNA", "authors": [ { "firstName": "Sam C.", "lastName": "Smith" }, { "firstName": "Maxine P.", "lastName": "Jones" } ], "pubTitle": "Australian Journal of Zoology", "tags": [ { "tag": "scary" }, { "tag": "secret rulers of the world" } ] } }, { "key": "001122", "state": 100, "data": { "articleTitle": "WOMBAT and WOMBAT-PK: Bioactivity Databases for Lead and Drug Discovery", "authors": [ { "firstName": "Marius", "lastName": "Damstra" } ], "pubTitle": "Chemical Biology: From Small Molecules to Systems Biology", "tags": [ { "tag": "Wrong Wombat" } ] } } ]
Если есть ошибка в скобках, запятых и т. Д., Это просто опечатка в моем примере, а не причина моей проблемы.
декодируйте ваш json как массив и переместите его как любой массив, как текущий:
$json_decoded= json_decode($json,true); $tab="\t"; foreach ($json_decoded as $key => $val) { echo "Article ".$val["key"]."\n" ; echo $tab."Authors :\n"; foreach ($val["data"]["authors"] as $key => $author){ echo $tab.$tab. ($key+1) ." - ".$author["firstName"]. " ".$author["lastName"]."\n"; } echo $tab."Article Title: ".$val["data"]["articleTitle"] ."\n"; echo $tab."Publication Title: ".$val["data"]["pubTitle"] ."\n"; echo $tab."Key: ".$val["key"]."\n"; }
и вы можете использовать тот же метод для xml как текущий:
$xml = simplexml_load_string($xmlstring); $json = json_encode($xml); $json_decoded = json_decode($json,TRUE); //the rest is same
для xml вы можете использовать функции SimpleXml или класс DOMDocument
чтобы узнать структуру ваших данных, которые api возвратит вам после преобразования в массив, используйте var_dump($your_decoded_json)
при отладке
Что-то вроде этого может быть хорошим началом для вас:
$output = []; // Loop through each entry foreach ($data as $row) { // Get the "data" block $entry = $row['data']; // Start your temporary array $each = [ 'article title' => $entry['articleTitle'], 'publication title' => $entry['pubTitle'], 'key' => $row['key'] ]; // Get each author's name foreach ($entry['authors'] as $i => $author) { $each['author' . ++$i . ' name'] = $author['firstName'] . ' ' . $author['lastName']; } // Append it to your output array $output[] = $each; } print_r($output);
Пример: https://eval.in/369313
Вы пытались использовать array_map ?
Это было бы примерно так:
$entries = json_decode($json, true); print_r(array_map(function ($entry) { return implode(', ', array_map(function ($author) { return $author['firstName']; }, $entry['data']['authors'])) . ', ' . $entry['data']['articleTitle'] . ', ' . $entry['key']; }, $entries));