搜索数组

时间:2011-09-13 00:02:03

标签: php

我有一个名为$ clantable的数组。这是一张超过175行的表。

现在,表格被分成一行一行。 (PHP)

0=> <table>
2=> <tr style="height: 32px; ">
3=> <td> Stuff here</td>
4=> <td> Stuff here</td>
5=> </tr>
6=> <tr style="height: 32px; ">
// etc
200=> </table>

我想在整个数组中搜索

<tr style="height: 32px; ">

如果我找到匹配项,请将其放入'$ tr_array'中。所以我可以回到'$ tr_array',然后从那里搜索。

我尝试过preg_match,strpos,in_array和array_search。


我希望它像这样

$tr_array[0] = 1; // line 1 of the clantable.  
$tr_array[1] = 7; // line 7 of the clantable is a new row. 
$tr_array[2] = 20; // line 20 of the clantable is a new row.  etc.

谢谢!

-Alan

3 个答案:

答案 0 :(得分:3)

<?php
function searchArrayText($clantable, $findText){
    foreach($findText as $e) {
        if(strpos($clantable, $e) !== false) {
            echo $e;
        }
    }
}
$findText = '<tr style="height: 32px; ">';
searchArrayText($clantable, $findText);


?>

不确定是否是最聪明的方法,但我使用它。

答案 1 :(得分:1)

使用Alice的代码......(+ 1)

我修改了它以附加到数组中。

<?php
function searchArrayText($table_array, $findText){
    $return_array = array();
    foreach($table_array as $key => $val) {
        if($findText == $val) {
            $return_array['key'][] = $key;
            $return_array['val'][] = $val;
        }
    }
    return $return_array;
}

$findText = '<tr style="height: 32px; ">';
$tr_array = searchArrayText($clantable, $findText);

?>

答案 2 :(得分:0)

当你说“如果我找到匹配项,将其放入'$ tr_array'”时,我假设'它'你需要一个以下格式的数组:

 array(
      0 => '<tr style="height: 32px; "><td>Some stuff</td><td>Some stuff</td></tr>',
      1 => '...',
      etc...
 )

如果这是您想要的,您可以将数组加入字符串并使用正则表达式。这将产生一个类似上面例子的数组

$results = array();
preg_match_all('%(<tr style="height: 32px; ">(?:<td>[A-Za-z0-9\s]*</td>)+</tr>)%', implode( '', $clantable), $results);
$tr_array = $results[0];
var_dump( $tr_array);

<强>输出:

array(2) {
    [0]=>
    string(72) "<tr style="height: 32px; "><td> Stuff here</td><td> Stuff here</td></tr>"
    [1]=>
    string(87) "<tr style="height: 32px; "><td> Second Example</td><td> Second Example Part 2</td></tr>"
  }

当你说“$ tr_array'然后从那里搜索”时,听起来你正在进行HTML解析/抓取。如果是这样,则不必形成tr_array。如果你想要,比如标签的内容,你可以这样做:

$results = array();
preg_match_all('%(?:<tr style="height: 32px; ">((?:<td>[A-Za-z0-9\s]*</td>)+)</tr>)%', implode('', $clantable), $results);
$td_array = $results[1];
var_dump( $td_array);

<强>输出:

array(2) {
    [0]=>
    string(40) "<td> Stuff here</td><td> Stuff here</td>"
    [1]=>
    string(55) "<td> Second Example</td><td> Second Example Part 2</td>"
  }

您可以继续解析这些结果以获取td标记的内容,或修改正则表达式为您执行此操作。但是,如果您不需要,我不建议使用正则表达式,因为您可以使用PHP的DOMDocument类来遍历HTML,假设您需要td标记的内容。它适用于字符串,并以易于分析的方式创建HTML的表示。

$doc = new DOMDocument();
$doc->loadHTML( implode( '', $clantable));
$elements = $doc->getElementsByTagName("tr");
echo 'Found ' . $elements->length . ' tr elements';
foreach( $elements as $el)
{
     if( trim( $el->getAttribute('style')) == 'height: 32px;')
     {
          foreach( $el->childNodes as $td_nodes)
          {
               echo '"' . $td_nodes->nodeValue . '"';
          }
     }
}

以上内容仅输出td标签的内容。