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 の 2 番目の値を照合することのみに関心があります (上記の例では、「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;  ?>

ただし、2 番目の要素のみを一致させようとしていることが既にわかっている場合は、これをスキップして次のようにできforeachます。

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

このチェックはtrue、test の有効な部分文字列に対して (または実際には見つかった一致の開始インデックス) を返します。そのため、index で始まる部分文字列のみが必要な場合は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 に答える