在数组中搜索部分或全部文本


search for partial or complete text in array

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

我真的只对匹配项目中的第二个值感兴趣(在上面的例子中,"测试"和搜索术语"术语"

我尝试过in_array,strpos,但没有成功。

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

如果我理解正确,$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

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

首先,我不知道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"
}

您应该能够将其适应您的特定用例。顺便说一下,strpos调用中$element周围的引号将把它强制转换为字符串。我怀疑这在PHP中是否必要(记不起了),但以防万一。。。