0

これを参照してください:

        $q = 'blah';
        for($k = 0; $k < count($results_array); $k++){
            $results_array_ . $k = explode(',', $results_array[$k]);
            foreach($results_array_ . $k as $key => $value){
                if (stripos($value, $q) === false) {
                unset($results_array_ . $k[$key]);
                break;
                }
            }
        }

3行目では単に「$results_array_。$k」を使用しており、正常に機能していますが、6行目では「unset($results_array_。$k [$ key])」でPHP解析エラーが発生しています。これは起こっていますか?

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


なぜ私がそれをしているのか:

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

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

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

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

ここで、上記の結果をresults_arrayの各インデックスに配置します。最後に、results_arrayは次のようになります。

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

1 に答える 1

2

元の質問への回答

unsetその引数が値、たとえば$varまたはを直接参照することを期待します$array['key']。他の値に基づいて引数を動的に作成する場合は、変数変数構文を使用する必要があります。

unset(${$results_array_ . $k[$key]});

これにより警告は削除されますが、根本的に欠陥があるため、コードは機能しません。あなたが言及する3行目は次のとおりです。

$results_array_ . $k = explode(',', $results_array[$k]);

これが行うことは、配列を分解し$kてから連結$results_array_$k、結果を破棄することです。あなたは同じように簡単に書くことができたでしょう

$k = explode(',', $results_array[$k]);

そしてそれは同じように機能します(おそらく存在しないものを与えないことを除いてE_NOTICE$_results_array_

したがって、PHPの基礎がどのように機能するかについて誤解しているようです。それを行うための良い方法を決定するために、あなたが何をしようとしているのかを説明する別の質問をするのが最善でしょう。

現在の質問への回答

一度に1つずつ手順を実行してみましょう。

  1. 文字列の配列を取得し、各文字列をで配列に変換して、配列explodeの配列を作成します。array_mapこれは、または単純なで行うことができますforeach
  2. アレイのアレイを1つの大きなアレイに「フラット化」します。array_mergeまたはを使用してこれを行うことができますarray_merge_recursive(詳細は少し異なりますが、考え方は同じです)。
  3. 平坦化された配列を検索し、興味のない要素を。で除外しarray_filterます。
  4. 必要に応じて、フィルター処理された配列のインデックスを再作成して、。が付いた連続した数値キーを持つようにしますarray_values

少し異なりますが、これを行うコードは次のとおりです(最初の行でステップ1と2を同時に実行していますarray_reduce):

$array = (...);
$array = array_reduce($array, function(&$result, $item) {
    return array_merge($result, explode(',', $item));
}, array());
$array = array_filter($array, function($item) use ($string) { 
    return strpos($item, $string) !== false;
});
$result = array_values($array);

派手な機能を使用せずに同じことを行うバージョン:

// Step 1
foreach($array as &$row) {
    $row = explode(',', $row);
}
unset($row);

// Step 2
$array = call_user_func_array('array_merge_recursive', $array);

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

// Step 4
$array = array_values($array);
于 2012-11-14T11:14:48.633 に答える