PHP中的非法字符串偏移值 - 只有两个字段失败

时间:2017-03-31 16:10:52

标签: php

我有两个脚本,一个从系统中擦除一些HTML输出并返回一个数据数组(本例中为锦标赛)。

当我var_dump此数组时,您会得到以下输出。

array(66) {
 [0]=>
  array(4) {
    ["date"]=>
    string(14) "2 January 2017"
    ["tournament"]=>
    string(43) "Brisbane International presented by Suncorp"
    ["surface"]=>
    string(10) "Hard Court"
    ["venue"]=>
    string(8) "Brisbane"
  }
 [1]=>
  array(4) {
   ["date"]=>
   string(14) "2 January 2017"
   ["tournament"]=>
   string(19) "Aircel Chennai Open"
   ["surface"]=>
   string(10) "Hard Court"
   ["venue"]=>
   string(7) "Chennai"
  }

以下是获取该数据的脚本

function processTournamentHTML($url) {
    $domOb = new DomDocument();
    $html = $domOb->loadHTMLFile($url);
    $domOb->preserveWhiteSpace = false; 
    $container = $domOb->getElementsByTagName('tr'); 

    $tournaments = array(); // BLANK ARRAY TO POPULATE

    // PROCESS THE TOURNAMENT HTML INTO A PHP ARRAY
    foreach($container as $row) {
        $items = $row->getElementsByTagName('td');
        $tournaments[] = array(
            "date" => $items->item(0)->nodeValue,
            "tournament" => $items->item(1)->nodeValue,
            "surface" => $items->item(2)->nodeValue,
            "venue" => $items->item(3)->nodeValue
        ); 
    }
    echo "Processing the following URL: " . $url;
    return $tournaments;
}

将所述数据插入我的数据库的脚本(所有样本数据)。

function processTournaments($tournaments, $tour) {
    // OPEN CONNECTION
    $conn = mysqli_connect("test", "test", "test", "test");

    foreach($tournaments as $tournament) {
        $date = $tournament["date"];
        $tournament = $tournament["tournament"];
        $surface = $tournament["surface"];
        $venue = $tournament["venue"];          
        $sql = "INSERT INTO data_table (date, tournament, surface, venue, tour) VALUES ($date, $tournament, $surface, $venue, $tour)";
        $query = mysqli_query($conn, $sql);
    }
    // CLOSE DB CONNECTION
    mysqli_close($conn);
    return "Finished processing for " . $tour;
}

我在URL / TO / FILE.php中运行我的代码

$tournaments = processTournamentHTML($url);
processTournaments($tournaments, "tournament_code");

正如您所看到的,我的示例数据包含66条记录,并且我收到了66次这些错误:

Warning: Illegal string offset 'surface' in URL/TO/FILE.PHP on line 47

Warning: Illegal string offset 'venue' in URL/TO/FILE.PHP on line 48

正在处理的示例HTML

<tr>
<td rowspan="3" width="133">2 January 2017</td>
<td width="294">Brisbane International presented by Suncorp</td>
<td width="90">Hard Court</td>
<td width="121">Brisbane</td>
</tr>
<tr>
<td rowspan="3" width="133">2 January 2017</td>
<td width="294">Shenzhen Open</td>
<td width="90">Hard Court</td>
<td width="121">Shenzhen</td>
</tr>

解决

我最终解决了这个问题,因为我使用了以下代码:

foreach($tournaments as $tournament) {
  $date = $tournament["date"];
  $tournament = $tournament["tournament"]; // WHEN YOU SEE IT
  $surface = $tournament["surface"];
  $venue = $tournament["venue"];
}

当你看到它时,它太烦人了。我在我的foreach中使用$tournament作为变量,它覆盖了我所在的$tournament索引。 -_-

1 个答案:

答案 0 :(得分:0)

你有

"surface" => $items->item(2)->nodeValue, "venue" => $items->item(3)->nodeValue

但是您在var转储中可以看到的位置项[2]和项目[3]中没有任何内容

array(66) {
[0]=>
array(4) {
["date"]=>
string(14) "2 January 2017"
["tournament"]=>
string(43) "Brisbane International presented by Suncorp"
["surface"]=>
string(10) "Hard Court"
["venue"]=>
string(8) "Brisbane"
}
[1]=>
array(4) {
["date"]=>
string(14) "2 January 2017"
["tournament"]=>
string(19) "Aircel Chennai Open"
["surface"]=>
string(10) "Hard Court"
["venue"]=>
string(7) "Chennai"
}

在上面的数组中,您只有两个索引。没有[2]和[3]