Недавно я столкнулся с проблемой кодирования, когда мне пришлось создавать простую trie в php, мне удалось это сделать, используя петли php и foreach, m недоволен самим кодом (кажется, он не прочен, как и должно быть), поэтому я пытаюсь реализовать его с помощью итераторов php.Итерация через сложный многомерный массив (структура данных Trie на PHP, улучшение кода)
Итак, у меня есть сложный массив (TRIE), например:
array(
'a' => array(),
'b' => array(
'a' => array(
'c' => array(
'o' => array(
'n' => array()
)
)
)
),
'x' => array(
'x' => array(
'x' => array()
)
)
);
И я хочу, чтобы проверить, «бекон» это слово, хранимое на этом синтаксического дерева, процесс, чтобы найти это должно быть путем итерации через массив и проверки, если каждый узел вложен и существует, например: мне нужно в корне элемент с ключом «b», затем внутри массива массива ['b'], мне нужно проверить, есть ли у меня array ['b'] ['a'], затем ['b'] ['a'] ['c'] и так далее.
С помощью цикла foreach я смог сделать это, передав новый массив по ссылке и проверив ключи. Теперь, используя итератор, кажется, я немного забиваю код (и тот факт, что при выполнении foreachs php копирует массив, заставляет меня думать, что это решение может использовать намного больше памяти, чем использование итераторов).
Поэтому код до сих пор это петля в то время как закончил условие, которое останавливается на сбою (текущий массив не имеет ключа Я ищу) или успех (слово это полное):
// 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