Я получаю сообщение об ошибке при попытке повторить некоторые данные, и я не могу понять, что я делаю неправильно. Это формат данных я вернулся из запроса API:Неопределенная ошибка индекса, связанная с массивом PHP
Array
(
[search-results] => Array
(
[entry] => Array
(
[0] => Array
(
[author] => Array
(
[0] => Array
(
[authname] => Griffin J.
[surname] => Griffin
[initials] => J.M.
)
[1] => Array
(
[authname] => Williams D.
[surname] => Williams
[initials] => D.H.
)
)
)
[1] => Array
(...etc...
)
)
)
)
Для справки выше распечатка данных из $eachJson
в коде ниже.
Я могу только выполнить запрос API, чтобы получить 100 результатов за один раз, поэтому я настроил цикл for
для выполнения поиска 100 раз, затем следующие 100 и т. Д. Поскольку на запись записано несколько author
с за запись, я настроил foreach
цикл для перебора авторов, и это то, где я получаю сообщение об ошибке:
Notice: Undefined index: author in C:\xampp\htdocs\academic_intelligence\public\ScopusTest.php on line 42
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\academic_intelligence\public\ScopusTest.php on line 42
Вот код:
$apiKey = "&apiKey=c2cb86c3a511ed34dd6f03f481c637c1";
$search1 = urlencode("badgers");
$search2 = urlencode(" OR weasels");
$start = 0;
$scopusData = [];
// create an array to represent citation values to ignore, i.e. not interested
// in any publications with less than 4 citations
$ignore = array(0, 1, 2, 3);
// set processing time for browser before timeout
ini_set('max_execution_time', 3600);
// override default PHP memory limit
ini_set('memory_limit', '-1');
// REST HTTP GET Request searching for people associated with keywords (term)
$searchLink = "http://api.elsevier.com/content/search/scopus?query=KEY(" . $search1 . $search2 . ")" . $apiKey . "&sort=citedby-count&count=100&start=" . $start . "&view=complete";
// save results to a variable
$searchResponse = file_get_contents($searchLink);
// convert JSON to PHP variable
$searchJson = json_decode($searchResponse, true);
// get total number of results for query to know when to stop iterating data
$total = $searchJson['search-results']['opensearch:totalResults'];
// iterate data loading next 200 results (max) each time and adding new results to array
for ($i = $start; $i <= $total; $i+=100) {
// REST HTTP GET Request searching for people associated with keywords (term)
$eachLink = "http://api.elsevier.com/content/search/scopus?query=KEY(" . $search1 . $search2 . ")" . $apiKey . "&sort=citedby-count&count=100&start=" . $i . "&view=complete";
// save results to a variable
$eachResponse = file_get_contents($eachLink);
$eachJson = json_decode($eachResponse, true);
foreach ($eachJson['search-results']['entry'] as $record) {
// array to store authors
$authors = [];
foreach ($record['author'] as $thisAuthor) { // **LINE 42**
// push initials and surname to array
array_push($authors, ($thisAuthor['initials'] . $thisAuthor['surname']));
};
// scopus ID
$scopusID = $record['dc:identifier'];
// paper title
$title = $record['dc:title'];
// date
$date = substr($record['prism:coverDate'], 0, 4);
// citations, if less than 4 then break out of iteration
if (!in_array(($cites = $record['citedby-count']), $ignore)) {
$cites = $record['citedby-count'];
} else {
break 2;
}
$thisData = [
"authors" => $authors,
"ID" => $scopusID,
"title" => $title,
"date" => $date,
"cites" => $cites
];
array_push($scopusData, $thisData);
}
};
// need to replace single quotes to avoid char escape
for ($i = 0; $i < count($scopusData); $i++) {
foreach ($scopusData[$i]['authors'] as &$edit) {
$edit = str_replace("'", "", $edit);
};
$scopusData[$i]['title'] = str_replace("'", "", $scopusData[$i]['title']);
};
Я выделил линию 42, который вызывает ошибку. Это должно быть что-то прямое, но это был долгий день, и я не могу понять проблему! Я все еще получаю правильные данные в конце, последний массив scopusData
включает в себя все авторы, взятые из этой неисправной петли foreach
, поэтому кажется странным, что я получаю ошибку.
Вы * уверены *, что каждая запись содержит 'author' элемент? Может быть, вы должны добавить 'ifset ($ record ['author'])' перед циклом foreach(). – Simba
@ Симба О, мужик, ладно, я идиот - это был долгий день! Окружайте цикл 'foreach' с помощью' isset ($ record ['author'] ', и теперь он работает нормально. Если вы опубликуете это как ответ, я нажму« принять этот ответ »или что-то еще ... спасибо! – jayrdi
Хе-хе, я знаю, что этот длинный день очень хорошо себя чувствую. Я повторно отправил свой комментарий в качестве ответа для вас. :) – Simba