在数组中搜索部分或完整的文本

时间:2013-07-29 21:38:35

标签: php foreach

我有一个HTML搜索表单:

 <form method="post">
    <input type="text" name="term" />
    <br />
    <input type="submit" name="submit" value="Submit" />
  </form>

然后我有一个foreach循环来检查数组项是否包含搜索词:

   <?php if (is_array($data['page'])): ?>
   <?php foreach ($data['page'] as $item): ?>
   <?php foreach($item as $item_member): ?> 
   <?php if(strpos($item_member, $_POST['term']) !== FALSE):  ?>
    <tr>
    <?php foreach ($columns as $key => $column): ?>
    <?php $key = parse_class($key); ?>
    <td class="<?php echo $key['class']; ?>"><a class="cell-link"
    href="<?php echo $details_link . $item[$details_id_field]; ?>">
    <?php  echo (!empty($item[$key['column']])) ? $item[$key['column']] : '&nbsp;'; ?>
    </a></td>
    <?php endforeach; ?>
    </tr>
    <?php endif; ?>
    <?php endforeach; ?>
    <?php endforeach; ?>
    <?php endif; ?>

这是一个更易阅读的版本

if(is_array($data['page'])){
    foreach($data['page'] as $item){
        if(array_search($_POST['term'], $item)){
            echo "<tr>";
            foreach($columns as $key => $column){
                $key = parse_class($key);
                echo '<td class="' . $key['class'] . '"><a class="cell-link" href="' . $details_link . $item[$details_id_field] . '">';
                echo (!empty($item[$key['column']])) ? $item[$key['column']] : '&nbsp;';
                echo '</a></td>';
            }
            echo '</tr>';
        }
    }
}

目前,仅当搜索字词与项目中的名称完全相同时,搜索才有效。

数组项包含以下信息:

234|test|21|Jul 28, 2013|0%|1375026328|1375026328|Test)/ 

我真的只对匹配项目中的第二个值感兴趣(在上面的例子“test”中搜索术语“term”

我试过in_array,strpos没有运气。

对于上面的例子,目前只有在搜索表单中输入确切的文本“test”时才会显示结果。如果我输入“tes”,例如一个不完整的搜索短语,则不显示任何内容。

2 个答案:

答案 0 :(得分:2)

如果我理解正确$item保存您引用的数组。

添加另一个foreach来迭代$item的元素,并为每个项目执行strpos($item_member, $_POST['term'])检查,而不是array_search

 <?php foreach($item as $item_member)): ?> 
 <?php    if(strpos($item_member, $_POST['term']) !== FALSE):  ?>
 <?php  // here do what you gotta do ?>
 <?php    endif;  ?>
 <?php  endforeach;  ?>

但是,如果你已经知道你只想匹配第二个元素 - 你可以跳过这个foreach而只是这样做:

<?php    if(strpos($item[1], $_POST['term']) !== FALSE):  ?>

对于任何有效的测试子字符串,此检查将返回true(或实际上是找到的匹配的开始索引) - 因此,如果您只想要从索引{{1}开始的子字符串您可以更改测试而不是:
0

!== FALSE

顺便说一句,=== 0语法难以阅读 - 我会改变它。

答案 1 :(得分:1)

首先,我不知道你想要234|test|21|Jul 28, 2013|0%|1375026328|1375026328|Test)/的意思。这是数组的0索引处的字符串吗?管道只是一种在视觉上分离数组元素的方法吗?

另外,你的代码也很难阅读,所以我没有阅读它。那就是说,我想我明白你要做什么。让我们假设你有一个包含一些内容的数组:

$arr = array(
    234,
    'test',
    'Jul 28, 2013',
    'testers',
);

让我们说你有一个用户输入字符串:

$input = 'tes';

我们想确定数组中的任何元素是否包含此字符串:

$matches = array();

foreach($arr as $element) {
    if (strpos("$element", $input) !== false) {
        #match found, store it
        $matches[] = $element;
    }
}

var_dump($matches);    //contains two elements, 'test', and 'testers'

var_dump的输出:

array(2) {
  [0]=>
  string(4) "test"
  [1]=>
  string(7) "testers"
}

您应该能够根据具体用例进行调整。顺便说一下,$element调用中strpos周围的引号是将它强制转换为字符串。我怀疑这在PHP中是必要的(不能回忆),但以防万一...