最近、私はphpで簡単なトライを構築しなければならないコーディングの課題に直面していました。私はPHPのイテレータを使って実装しようとしているので、コード自体に満足していません。複雑な多次元配列を反復する(PHPのTrieデータ構造、改善コード)
だから、私は例えば、複雑な配列(トライ)を持つ:
array(
'a' => array(),
'b' => array(
'a' => array(
'c' => array(
'o' => array(
'n' => array()
)
)
)
),
'x' => array(
'x' => array(
'x' => array()
)
)
);
そして私は「ベーコン」は、それがこのトライに保存されているWordのかどうかを確認したい、プロセスは、それがあるべき見つけるために配列を反復し、各ノードがネストされて存在するかどうかをチェックします。例えば、ルートにキー 'b'を持つ要素が必要です。次に配列配列['b']の中に、配列['b'] ['a']、['b'] ['a'] ['c']など。
foreachループでは、新しい配列を参照渡ししてキーをチェックすることで、私はそうすることができました。今ではイテレータを使用すると、コードをちょっと叩いているようです(foreachs phpを実行すると配列をコピーすると、このソリューションはイテレータよりも多くのメモリを使用するかもしれません)。
だから今までのコード、それは失敗(現在のアレイは、私が探してるの鍵を持っていない)、または成功(それは完全だ単語)で停止し終えた状態を持っているwhileループです:
// OUTSIDE THE LOOP
$finished = false;
$string = 'bacon';
$string = str_split($string);
$queue = new SplQueue();
// Enqueue all the letters to the queue -> skipping this because it's boring
// FIRST WHILE LOOP
$iterator = new ArrayIterator($array);
$iterator->key(); // No match with queue -> check next key
// SECOND WHILELOOP
$iterator->next();
$iterator->key(); // Matches with the key I want do dequeue (B),
$next = new ArrayIterator($array[$iterator->key()]);
$queue->dequeue();
// THIRD WHILE LOOP
$next->key(); // Match [A] -> create new iterator
$next = new ArrayIterator($next[$next->key()]);
$queue->dequeue();
// 4TH WHILE LOOP
$next->key(); // Match [C] -> create new iterator
$next = new ArrayIterator($next[$next->key()]);
$queue->dequeue();
// 5TH WHILE LOOP
$next->key(); // Match [O] -> create new iterator
$next = new ArrayIterator($next[$next->key()]);
$queue->dequeue();
// 5TH WHILE LOOP
$next->key(); // Match [N]
$next = new ArrayIterator($next[$next->key()]);
$queue->dequeue(); // queue empty, throw success
これまでのところこれまでのことですが、ループごとに新しいArrayIteratorを作成しているので、誰かがこの問題を解決できるかどうかを知りたいと思っていました。
ありがとうございます。ここ
コードがすでに動作している場合は、おそらくhttps://codereview.stackexchange.com/ – Chris