0

results_array という名前の配列があります。

var_dump($results_array):
0 => php,mysql,jquery,ruby,html,css,lamp
1 => mouse,keyboard,laptop,pad
2 => table,sofa,caption
3 => control,television,control television,television control

クエリを表す$qがあります。$results_array を検索し、クエリとは関係のない項目を削除したいので、設定した場合$q=a、結果配列は次のようになります。

0 => lamp
1 => keyboard,laptop,pad
3 => table,sofa,caption
4 => empty

ここで、上記の結果を results_array の各インデックスに入れたいと思います。最後に、results_array は次のようになります。

0 => lamp
1 => keyboard
2 => laptop
3 => pad
4 => table
5 => sofa
6 => caption

私のコードは次のとおりです。

foreach($results_array as &$row) {
            $row = explode(',', $row);
        }
        unset($row);
        $results_array = call_user_func_array('array_merge_recursive', $results_array);

        foreach ($array as $k => $v) {
            if(strpos($v, 'a') === false) unset($array[$k]);
        }
        $results_array = array_values($results_array);

これはまさに私が必要とすることを行います。今、$q = 'tele co' を設定し、上記のコード set $ = 'tele co' を適用した後、空を返しますが、次の理由でそうすべきではありません:

3 => control,television,control television,television control

'control TV,television control' が返されるはずですが、返されないため、コードを次のように変更します。

foreach($results_array as &$row) {
            $row = explode(',', $row);
        }
        unset($row);
        $results_array = call_user_func_array('array_merge_recursive', $results_array);
// HERE IS CHANGED ****
        $q = preg_split('/\s+/', trim($q));
        foreach ($results_array as $key => $value) {
            foreach ($q as $query) {
                if (stripos($value, $query) === false) {
                    unset($results_array[$key]);
                    break;
                }
            }
        }
// ****
        $results_array = array_values($results_array);

$q = 'tele co' を渡すことで、まだ機能していません。$q にある 'tele' と 'co' の両方を取得したため、'television control' と 'control TV' が返される必要があります。

どんな種類の助けにも感謝します

4

2 に答える 2

1

仮定:

$q = 'a c';
$results_array = array(
    'php,mysql,jquery,ruby,html,css,lamp',
    'mouse,keyboard,laptop,pad',
    'table,sofa,caption',
    'control,television,control television,television control'
);

解決:

$result = array_map(function ($element) use ($q) {
    $words = explode(',', $element);
    return array_filter($words, function ($word) use ($q) {
        $qwords = explode(' ', $q);
        return count(array_filter($qwords, function ($qword) use ($word) {
            return strpos($word, $qword) !== false;
        })) > 0;
    });
}, $results_array);

出力 print_r($result);:

Array
(
    [0] => Array
        (
            [5] => css
            [6] => lamp
        )

    [1] => Array
        (
            [1] => keyboard
            [2] => laptop
            [3] => pad
        )

    [2] => Array
        (
            [0] => table
            [1] => sofa
            [2] => caption
        )

    [3] => Array
        (
            [0] => control
            [2] => control television
            [3] => television control
        )

)
于 2012-11-14T17:51:33.053 に答える
1

私があなたの質問を正しく理解していれば、あなたはこれを探しています:

$result = array();
$parts = explode( ' ', $q);
foreach($results_array as $words){
     foreach( explode(',', $words) as $word){
         $good = true;

         foreach( $parts as $p){
             if( strpos( $word, $p) === false){
                 $good = false;
                 break;
             }
         }

         if( $good){
            $result[] = $word;
         }
     }
}
于 2012-11-14T17:51:43.800 に答える