2013-07-29 123 views
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)/ 

我真的仅在匹配项中的第二个值(在上面的“试验”的例子有兴趣与搜索术语“术语”

我试过in_array,strpos没有运气

对于上面的例子,目前只有在搜索表单中输入“test”的确切文字时才会出现结果。这是一个不完整的搜索短语的例子,没有任何显示。

+2

你的代码是很难阅读所有'<?php'开放标签 – sgroves

+1

'preg_grep()'可能会做你想要什么 - 通过正则表达式搜索字符串的数组。 –

回答

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

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

+0

嗨Alfasin,非常感谢,现在开始工作了!现在唯一的麻烦是,如果我输入了一个不完整的搜索词,它会提出多个相同的条目 例如,如果我输入't',它会产生3个“test”结果 如果我输入'te'它带来了2个“测试”结果 如果我输入“tes”它会带来2个“测试”结果 如果我输入“测试”,它会产生1个“测试”结果) – scott

+0

@scott为了弄清楚我们需要看到新版本的代码 – alfasin

1

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

此外,您的代码也很难阅读,所以我没有阅读它。这就是说,我想我明白你想要做什么。比方说,你有它的一些东西的数组:

$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(不记得),但以防万一......

+0

嗨sgroves,第一位:234 | test | 21 | Jul 28,2013 | 0%| 1375026328 | 1375026328 | Test)/(是数组$ item中包含的内容)分开。我现在要试试你的方法。谢谢 – scott