2015-09-09 2 views
1

Я получаю сообщение об ошибке при попытке повторить некоторые данные, и я не могу понять, что я делаю неправильно. Это формат данных я вернулся из запроса 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, поэтому кажется странным, что я получаю ошибку.

+0

Вы * уверены *, что каждая запись содержит 'author' элемент? Может быть, вы должны добавить 'ifset ($ record ['author'])' перед циклом foreach(). – Simba

+0

@ Симба О, мужик, ладно, я идиот - это был долгий день! Окружайте цикл 'foreach' с помощью' isset ($ record ['author'] ', и теперь он работает нормально. Если вы опубликуете это как ответ, я нажму« принять этот ответ »или что-то еще ... спасибо! – jayrdi

+0

Хе-хе, я знаю, что этот длинный день очень хорошо себя чувствую. Я повторно отправил свой комментарий в качестве ответа для вас. :) – Simba

ответ

2

Вы уверены, что каждая запись содержит элемент автора?

Возможно, вам нужно добавить ifset ($ record ['author']) перед циклом foreach().

(повторно отправленный комментарий в ответ как запрос ФП в)

Смежные вопросы