PHP:urldecode / explode中的未定义偏移量

时间:2012-12-04 04:36:52

标签: php preg-replace preg-match urldecode

尝试解构一个函数我收到一个警告通知,用于从数据库中检索CSV数据。

该函数从index.php文件调用,可以格式化为

$masterRecords = $qb->genResultsTable($qid, $config[27]);

$config[27]是动态设置的,但有助于理解;它是一个以句点分隔的整数列表。例如"3.4.5.6.7.8.9.25.141.137.83"
$qid是一个整数 - 例如"63"

该功能有效,但我想知道我是否可以摆脱php通知 获取通过循环的每个项目的通知:

Notice: Undefined offset: 106 in /vagrant/public/arc/inc/lib.php on line 522

致电堆栈:

1   0.0028  417156  {main}()    ../index.php:0
2   1.2886  473280  qb->genResultsTable()   ../index.php:66

功能:

public function genResultsTable($qid, $clist) {
  $url = "{$this->qb_ssl}{$this->db_id}?act=API_GenResultsTable&ticket={$this->ticket}&apptoken={$this->app_token}&qid={$qid}&clist={$clist}&slist={$clist}&options=csv";
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cjFile);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $this->ckfile);
  //  curl_setopt($ch, CURLOPT_HEADER, true);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_COOKIE, "TICKET=" . urlencode($this->ticket));
  $r = curl_exec($ch);
  $r = preg_replace_callback('/([\'"])([^"]+)\1/', 'call_back', $r);
  preg_match_all('/(.*)\r\n/', $r, $matchs);
  $fields = explode('.', $clist);
  $count = count($matchs[0]);
  $arrs = array();
  for ($i = 1; $i < $count; $i++) {
    $explode_arr = explode(',', $matchs[0][$i]);
    $arr = array();
    foreach ($fields as $key => $field) {
  // vv THIS BELOW LINE IS THE LINE THAT IS INDICATED IN ERROR vv
      $arr[$field] = urldecode($explode_arr[$key]);
    }
    $arrs[] = $arr;
  }
  return $arrs;
}

function call_back($matches) {
  return urlencode($matches[0]);
}

1 个答案:

答案 0 :(得分:0)

为了使@HamZa的答案更清楚,基本上你收到通知的原因是因为你正在访问一个索引不存在或者没有设置的数组......

理想情况下,每次使用带有变量键的[]时,最好测试该数组的键索引/键是否存在。

因此,只需将doSomeThing($arr[$x])添加到

前面
if(isset($arr[$x])){
     doSomeThing($arr[$x])
}

这将阻止无效的数组访问,通知应该消失。