0

我有一个 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)/ 

我真的只对匹配 item 中的第二个值感兴趣(在上面的示例中,“test”与搜索词“term”

我试过 in_array,strpos 没有运气。

对于上面的示例,目前仅当我在搜索表单中输入确切的文本“test”时才会显示结果。例如,如果我输入“tes”,这是一个不完整的搜索短语,则什么也不会显示。

4

2 回答 2

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任何有效的测试子字符串返回(或实际上是找到的匹配的开始索引) - 因此,如果您只想要从索引开始的子字符串,0您可以更改测试而不是:
!== FALSE

=== 0

顺便说一句 -:语法很难阅读 - 我会改变它。

于 2013-07-29T21:46:56.140 回答
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 中是必要的(不记得了),但以防万一......

于 2013-07-29T21:47:06.233 回答