我有两个脚本,一个从系统中擦除一些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
索引。 -_-
答案 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]