Комментарии 37
пример практически из манов.
это всё удобно, конечно, но я до данного момента нашёл только в одном случае реальное применение SPL (без него было бы не обойтись)
это всё удобно, конечно, но я до данного момента нашёл только в одном случае реальное применение SPL (без него было бы не обойтись)
Мое мнение, написание SPL в PHP, это попытка реализовать нечто похожее на STL в C++
хм, а насколько вообще оправдано использование SPL? просто я являюсь и прикладником и веб-разработчиком. В С++ активно использую STL, а вот в PHP иногда не хватает подобного. Вот и хотелось бы узнать насколько данный инструмент мощен
А если названия ключей в разных масивах будут совпадать ?
немного не понял вопроса, поэтому задам свой: а причем здесь разные массивы?
Ну этот клас берет многомерный масив и делает одномерный, складывая ключ значение как он нашел в масивах и во вложеных масивах, вполне возможно иметь в двух вложеных масивах одинаковые названия ключей, как тогда они будут именоваться уже в новом выдаваемом одномерном масиве.
Кстати очень интересный вопрос, надеюсь автор прояснит ситуацию. Хочется надеяться, что будет просто массив с элементами под данным индексом лежать, иначе это сильно обесценивает данный метод.
Автор конечно прояснит
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";
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";
где Вы видите создание массива?
мы видим создание объекта, но в пхп никто не мешает обращаться к полям объекта как к элементам массива.
И потом в объекте тоже нельзя сделать два поля с одинаковым именем.
И потом в объекте тоже нельзя сделать два поля с одинаковым именем.
Замечательно!
Если в объекте нельзя создать поля с одинаковыми именами, в массиве видимо тоже.
Еще раз задаю вопрос: Где именно происходит копирование элементов в массив?
Вы сами себе противоречите.
Ещё раз - итератор это указатель на структуру данных.
Купите книжку Бьярна Страуструпа по Си++ и почитайте что такое итераторы.
Если в объекте нельзя создать поля с одинаковыми именами, в массиве видимо тоже.
Еще раз задаю вопрос: Где именно происходит копирование элементов в массив?
Вы сами себе противоречите.
Ещё раз - итератор это указатель на структуру данных.
Купите книжку Бьярна Страуструпа по Си++ и почитайте что такое итераторы.
что такое итераторы я знаю;)просто когда мы делаем форич созданного итератора мы ведь выводим все его поля?так? или каким то хитрым образом перехватывается форич (просто я не знаю возможно ли перехватить форич в пхп, поэтому и спрашиваю)?
пример просто не успел еще посмотреть
пример просто не успел еще посмотреть
foreach для итераторов работает по другому
http://ru2.php.net/manual/en/language.oo…
http://ru2.php.net/manual/en/function.Ar…
http://ru2.php.net/manual/en/language.oo…
http://ru2.php.net/manual/en/function.Ar…
Я для вас даже пример написал, не знаю почему вы сами не проверили
$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";
$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 не знаю, поэтому буду отвечать на теоретическом уровне. Если массивы отсортированы, то вместо n*m итераций (n,m - длины массивов), можно будет сделать k итераций (k меньшее из n и m) чтобы сказать со 100% вероятностью да или нет. С меньшим количеством итераций...хм...ну если под сравнением понимать в том числе и нахождение подмассива пересечения или выявление одного массива как подмассива другого массива, то это делается динамическим программированием, это крайне элегантно, но количество итераций опять будет n*m.
Если же нас интересует сравнение массивов не как множеств элементов, а именно как векторов то в этом случае нам всегда понадобится z итераций (z - большее из n и m).
Может что еще упустил из виду.
Если же нас интересует сравнение массивов не как множеств элементов, а именно как векторов то в этом случае нам всегда понадобится z итераций (z - большее из n и m).
Может что еще упустил из виду.
что Вы подразумеваете под сравнением?
Массив A
789;CCC
123;ZZZ
456;XXX
Массив Б
123;ZZZ
789;CCC
456;WWW
Надо сверить совпадают ли и если не совпадают, то выкатить список ошибок. Я делаю цикл по одному массиву, а внутри цикл по второму. В результате получится n*m операций сравнения. На маленьких объёмах терпимо, но если больше 40 000 строк в каждом массиве начинает занимать много времени и это расшатывает мою нервную систему.
789;CCC
123;ZZZ
456;XXX
Массив Б
123;ZZZ
789;CCC
456;WWW
Надо сверить совпадают ли и если не совпадают, то выкатить список ошибок. Я делаю цикл по одному массиву, а внутри цикл по второму. В результате получится n*m операций сравнения. На маленьких объёмах терпимо, но если больше 40 000 строк в каждом массиве начинает занимать много времени и это расшатывает мою нервную систему.
то есть надо проверить совпадают ли множества а не векторы? отсортируйте (тот же quicksort вполне справится) и делайте за один проход
А если количество не совпадает и могут быть не совпадающие записи т.е. возможна полнейшая мешанина?
хм, если не совпадает количество то выводятся лишние элементы в большем массиве, если не совпадают то в зависимости от того какой уровень крутости сравнения нужен либо делаем шаг (или несколько) вперед и смотрим что творится там, после чего анализируем данные от нескольких шагов. Либо если нужно банальное несовпадение(то есть симметричная разность множеств), то (мы разбираем случай сортировки по возрастанию) смотрим какое меньше то и лишнее и делаем по этому массиву шаг вперед, а на другом массиве остаемся на том же элементе.
Это чит какой то ;) Спасибо за ссылку.
а каково быстродействие этой функции?
А чем автору не понравилась функция array_walk_recursive() ?
http://ca3.php.net/manual/en/function.array-walk-recursive.php
http://ca3.php.net/manual/en/function.array-walk-recursive.php
"кучу" рекурскивных функций? Имхо, одной будет достаточно...
1. как получить breadcrumb для каждого элемента?
2. как разложить массив «на плоскость», сделав breadcrumb ключами элементов?
2. как разложить массив «на плоскость», сделав breadcrumb ключами элементов?
У меня вопрос по поводу подобного случая — я вот таким же примерно методом получаю пары ключ-значение из конфига, конфиг хранится как раз в массиве многоуровневом. Вывожу это дело и формирую на основе него форму изменения конфига в админке приложения. Каким образом можно было бы русифицировать ключи, причем для админки. Т.е. сами ключи не трогать, но при выводе в админку подставлять русские значения.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Рекурсивный обход массива