2013-07-29 195 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