Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP是否在表(文件)中查找特定值?_Php - Fatal编程技术网

PHP是否在表(文件)中查找特定值?

PHP是否在表(文件)中查找特定值?,php,Php,我有一个table.html文件,希望得到以下值:$age、$height、$weight table.html: <tr><td class="key">Age</td><td class="value">24</td></tr> <tr><td class="key">Height</td><td class="value">169</td></tr>

我有一个table.html文件,希望得到以下值:$age、$height、$weight

table.html:

<tr><td class="key">Age</td><td class="value">24</td></tr>
<tr><td class="key">Height</td><td class="value">169</td></tr>
<tr><td class="key">Weight</td><td class="value">51</td></tr>
24岁
高度169
重量51
到目前为止,我已经编写了以下代码:

$html=文件获取内容(“table.html”);
libxml\u使用\u内部错误(true);
$doc=新文档;
$doc->loadHTML($html);
$xpath=新的DOMXpath($doc);
//表上的名称属性
$age=$xpath->query('//td[@class=“key”]')->项(0);
echo$age->textContent;
$age的“echo”结果是age,但我希望它是24


如何在同一代码中获得身高和体重结果?

您想要的类名是
value
,而不是
key
,因此您需要相应地修改XPath表达式:

$result = $xpath->query( '//td[@class="value"]');

$age = $result->item(0)->textContent;
$height = $result->item(1)->textContent;
$weight = $result->item(2)->textContent;
注意,我已经删除了另外两个XPath调用。正如Jonathan在下面的评论中所指出的,一个调用就足够了,其余的项可以从结果节点列表中检索

至于输出检索到的值,您只需使用
echo
,使用
isset()
。这是为了确保仅在设置了数量时才回显数量:

echo (isset($age)) ? "Age: $age\n" : '';
echo (isset($age)) ? "Height: $height\n" : '';
echo (isset($age)) ? "Weight: $weight\n" : '';
上述代码应产生:

Age: 24
Height: 169
Weight: 51


更新

如您在注释中所述,如果其中一个
块不存在,则此操作将失败。在这种情况下,您可以简单地使用
foreach
循环来显示项目:

$quantities = $xpath->query( '//td[@class="key"]');
$values = $xpath->query('//td[@class="value"]');

foreach ($values as $key => $value) {
    echo $quantities->item($key)->textContent .' = '. $value->textContent."\n";
}
即使缺少一个(或多个)
标记,也会返回正确的结果。它会打印出里面的任何值

例如,如果缺少“高度”行,则它将输出:

Age = 24
Weight = 51

如果您知道文件的定义结构,类似这样的东西会起作用;使用
->nextSibling
->第(i)项

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age     = $xpath->query( '//td[@class="key"]')->item( 0);
$height  = $xpath->query( '//td[@class="key"]')->item( 1);
$weight  = $xpath->query( '//td[@class="key"]')->item( 2);

echo "\nAge: "    . $age->nextSibling->textContent;
echo "\nHeight: " . $height->nextSibling->textContent;
echo "\nWeight: " . $weight->nextSibling->textContent;

也适用于空白值

编辑

另一种方法是通过文本内容获取元素

$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age     = $xpath->query( '//td[text()="Age"]')->item( 0);
$height  = $xpath->query( '//td[text()="Height"]')->item( 0);
$weight  = $xpath->query( '//td[text()="Weight"]')->item( 0);

echo "\nAge: "    . $age->nextSibling->textContent;
echo "\nHeight: " . $height->nextSibling->textContent;
echo "\nWeight: " . $weight->nextSibling->textContent;
$html=文件获取内容(“table.html”);
libxml\u使用\u内部错误(true);
$doc=新文档;
$doc->loadHTML($html);
$xpath=新的DOMXpath($doc);
//表上的名称属性
$age=$xpath->query('//td[text()=“age”]')->项(0);
$height=$xpath->query('//td[text()=“height”]')->项(0);
$weight=$xpath->query('//td[text()=“weight”]')->项(0);
回显“\nAge:”$年龄->下一步浏览->文本内容;
回声“\n光:”$高度->下一步浏览->文本内容;
回显“\n重量:”$权重->下一步浏览->文本内容;

是否
@class=“value”
不起作用?class=“value”起作用。但在某些情况下,如果高度值为空,那么重量将显示为高度。@Cyborg:如果表中没有一个元素(比如高度),您想怎么做?是否要显示其余的数量?或者类似于
Height:undefined
?@AmalMurali:是的,如果元素Height不存在,那么我不想显示它并处理所有其他元素。如果Height值为空怎么办?@Cyborg:如果为空,则不会显示该值。如果要确保它不是空的,可以执行
If(isset($height)){//echo value}
和类似操作;只要一次就可以了。然后,您可以从结果节点列表中获取项目。@JonathanSampson:没错。我编辑了答案以反映这一点,谢谢:)@Cyborg:如果高度值为空,它将不会显示。可以通过从HTML表中删除height元素来检查这一点。我不确定你是不是在问这个问题,但如果不是,你能更详细地解释一下吗?你说的也适用于空白值是什么意思?OP在你的回答上贴了一条评论,说“如果高度值为空怎么办?”。它只是说明,如果该值为空,它将继续工作。@Jack是否可以将//td[@class=“key”]替换为Age?因为这样我可以避免项目(0)、项目(1)和项目(2),并且我将100%确保该值为Age@JackB:我的解决方案也是如此。代码将正常执行,Height的值将为空。您可以更改xpath查询以通过命名选择元素(例如,将其更改为
//td[text()=“Age”]
),但无法删除
->项(0)
,因为这是返回结果的方式。例子:
Age: 24
Height: 169
Weight: 51
$html = file_get_contents("table.html");

libxml_use_internal_errors( true);
$doc = new DOMDocument;
$doc->loadHTML( $html);
$xpath = new DOMXpath( $doc);

// A name attribute on a <td>
$age     = $xpath->query( '//td[text()="Age"]')->item( 0);
$height  = $xpath->query( '//td[text()="Height"]')->item( 0);
$weight  = $xpath->query( '//td[text()="Weight"]')->item( 0);

echo "\nAge: "    . $age->nextSibling->textContent;
echo "\nHeight: " . $height->nextSibling->textContent;
echo "\nWeight: " . $weight->nextSibling->textContent;
$result = array();
foreach (array('age', 'height', 'weight') as $key => $value) {
    $result[$value] = $xpath->query( '//td[@class="value"]')->item($key)->textContent;
}

print_r($result);