Как стать автором
Обновить

Комментарии 37

пример практически из манов.
это всё удобно, конечно, но я до данного момента нашёл только в одном случае реальное применение SPL (без него было бы не обойтись)
Мое мнение, написание SPL в PHP, это попытка реализовать нечто похожее на STL в C++
хм, а насколько вообще оправдано использование SPL? просто я являюсь и прикладником и веб-разработчиком. В С++ активно использую STL, а вот в PHP иногда не хватает подобного. Вот и хотелось бы узнать насколько данный инструмент мощен
данный инструмент используется сравнительно недавно, хотя и упрощает многое.
на мой взгляд это достаточно интересное решение, которое только облегчает работу.
Хотя с мощью STL оно не сравнится в силу различия применения языков
А если названия ключей в разных масивах будут совпадать ?
немного не понял вопроса, поэтому задам свой: а причем здесь разные массивы?
Ну этот клас берет многомерный масив и делает одномерный, складывая ключ значение как он нашел в масивах и во вложеных масивах, вполне возможно иметь в двух вложеных масивах одинаковые названия ключей, как тогда они будут именоваться уже в новом выдаваемом одномерном масиве.
Кстати очень интересный вопрос, надеюсь автор прояснит ситуацию. Хочется надеяться, что будет просто массив с элементами под данным индексом лежать, иначе это сильно обесценивает данный метод.
Автор конечно прояснит
1) Итератор - это не копия, это указатель на элементы
2) покажите мне в примере где именно создается масиив

Предлагаю запустить следующий пример (не обращайте внимание на некорректную работу с типами)
$array_multi = array(
"myKey" => "myValue",
"myKey2"=> array(
"myKey2Array" => "value2Array",
"myKey3Array" => "value3Array",
"myKey4Array" => "value4Array",
"myKey5Array" => array("test", "tata", "france")));

$array_iterator1=new RecursiveArrayIterator($array_multi);

foreach($array_iterator1 as $key=>$value)
echo $key.' — '.$value."\n"

$array_iterator2 = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array_multi));

foreach($array_iterator2 as $key=>$value)
echo $key.' — '.$value."\n";
где Вы видите создание массива?
мы видим создание объекта, но в пхп никто не мешает обращаться к полям объекта как к элементам массива.
И потом в объекте тоже нельзя сделать два поля с одинаковым именем.
Замечательно!
Если в объекте нельзя создать поля с одинаковыми именами, в массиве видимо тоже.
Еще раз задаю вопрос: Где именно происходит копирование элементов в массив?
Вы сами себе противоречите.
Ещё раз - итератор это указатель на структуру данных.
Купите книжку Бьярна Страуструпа по Си++ и почитайте что такое итераторы.
что такое итераторы я знаю;)просто когда мы делаем форич созданного итератора мы ведь выводим все его поля?так? или каким то хитрым образом перехватывается форич (просто я не знаю возможно ли перехватить форич в пхп, поэтому и спрашиваю)?
пример просто не успел еще посмотреть
теперь понял;) спасибо за разъяснение
Я для вас даже пример написал, не знаю почему вы сами не проверили
$array_multi = array(
"myKey" => "myValue",
"myKey2"=> array(
"myKey" => "myValue",
"myKey21" => "value3Array",
"myKey4Array" => "value4Array",
"myKey5Array" => array("test", "tata", "france")));

$array_iterator2 = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array_multi));

foreach($array_iterator2 as $key=>$value)
echo $key.' — '.$value."\n";
использовать итератор для прохода по обычному массиву это удар по перфомансу системы и простейший тест это доказывает.

массивам - функции, объектам - итераторы.
Очень хочется надеятся, что разработчики проведут оптимизацию
Скажите, а есть элегантный и правильный способ сравнения двух массивов кроме последовательного прохода обоих массивов (удалять элементы нельзя)? Вопрос применим к AutoIT
про AutoIt не знаю, поэтому буду отвечать на теоретическом уровне. Если массивы отсортированы, то вместо n*m итераций (n,m - длины массивов), можно будет сделать k итераций (k меньшее из n и m) чтобы сказать со 100% вероятностью да или нет. С меньшим количеством итераций...хм...ну если под сравнением понимать в том числе и нахождение подмассива пересечения или выявление одного массива как подмассива другого массива, то это делается динамическим программированием, это крайне элегантно, но количество итераций опять будет n*m.
Если же нас интересует сравнение массивов не как множеств элементов, а именно как векторов то в этом случае нам всегда понадобится z итераций (z - большее из n и m).
Может что еще упустил из виду.
что Вы подразумеваете под сравнением?
Массив A
789;CCC
123;ZZZ
456;XXX

Массив Б
123;ZZZ
789;CCC
456;WWW

Надо сверить совпадают ли и если не совпадают, то выкатить список ошибок. Я делаю цикл по одному массиву, а внутри цикл по второму. В результате получится n*m операций сравнения. На маленьких объёмах терпимо, но если больше 40 000 строк в каждом массиве начинает занимать много времени и это расшатывает мою нервную систему.
то есть надо проверить совпадают ли множества а не векторы? отсортируйте (тот же quicksort вполне справится) и делайте за один проход
А если количество не совпадает и могут быть не совпадающие записи т.е. возможна полнейшая мешанина?
хм, если не совпадает количество то выводятся лишние элементы в большем массиве, если не совпадают то в зависимости от того какой уровень крутости сравнения нужен либо делаем шаг (или несколько) вперед и смотрим что творится там, после чего анализируем данные от нескольких шагов. Либо если нужно банальное несовпадение(то есть симметричная разность множеств), то (мы разбираем случай сортировки по возрастанию) смотрим какое меньше то и лишнее и делаем по этому массиву шаг вперед, а на другом массиве остаемся на том же элементе.
Это чит какой то ;) Спасибо за ссылку.
помогло?)
а каково быстродействие этой функции?
скорость работы этой функции намного превышает скорость работы такойже написанной на PHP, т.к. эта функция написана на Си.

Лучше всего написать маленький тестик и посмотреть, думаю раз в 10 быстрее минимум чем реализация на PHP %)
А чем автору не понравилась функция array_walk_recursive() ?

http://ca3.php.net/manual/en/function.array-walk-recursive.php
Автор хотел показать новую возможность. Автор даже метку поставил SPL
Пост для тех кто интересуется развитием PHP
"кучу" рекурскивных функций? Имхо, одной будет достаточно...
1. как получить breadcrumb для каждого элемента?
2. как разложить массив «на плоскость», сделав breadcrumb ключами элементов?
У меня вопрос по поводу подобного случая — я вот таким же примерно методом получаю пары ключ-значение из конфига, конфиг хранится как раз в массиве многоуровневом. Вывожу это дело и формирую на основе него форму изменения конфига в админке приложения. Каким образом можно было бы русифицировать ключи, причем для админки. Т.е. сами ключи не трогать, но при выводе в админку подставлять русские значения.
gettext
да, но у меня по умолчанию язык приложения ru, а перевод например есть на en, следовательно перевод можно будет увидеть только при переключении языка.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории