Forum Webscript.Ru
Программирование => PHP => Тема начата: Metaller от 09 Сентября 2002, 13:47:24
-
Объясните чайнику, это глюк в ДНК или в ПХП :) ?
Ситуация: массив перебирается each\'ем. При определенных условиях из цикла происходит выход брейком.
Потом делается prev и после этого продолжается цикл. По идее, он должен начаться с того элемента, после которого произошел выход из первого цикла. Верно?
Так и происходит. Прев работает, each работает... все ок.
До тех пор, пока не происходит выход после последнего элемента массива. В этом случае прев не работает.
Насколько я понимаю, prev переводит внутренний указатель массива на предыдущий элемент. Следовательно, после того, как each перебрал все элементы массива, prev должен поставить указатель на последний элемент. Или не так?
Так, вот, этого не происходит. Если each дошел до конца массива - prev не работает. Хотя end работает замечательно. В чем может быть глюк? Или я в ман\'е что-то не заметил?
For RomikChef: Плиз, если не можешь ответить по теме - не отвечай вовсе. :)
-
Metaller
Код покажи
-
ThE0ReTiC
Исходного кода уже не осталось.....
примерно такой код...
//$type - значение ключа, которое приходит извне, и с которого нужно начать перебор массива.
//$half - половина длинны массива.
reset($SomeArray);
if(isset($type)) {
while(list($key, $item) = each($SomeArray)) {
if($type==$key) {break;}
}
prev($SomeArray);
}
////кусок хтмл\'я
for($i=0;$i<$half;$i++) {
list($key, $item) = each($SomeArray);
if(isset($type)&&($type!=$key)) continue;
//...................
}
Нечто подобное...
-
А я все-таки выступлю не по теме.
по-моему, ассоциативные массивы как раз и придумывались, чтобы по ним не ползать перебором.
-
А если мне нужно вывести все элементы ассоциативного массива, начиная с какого-то?
-
Значит, это неправильный массив
-
RomikChef
Ты опять за своё. Я же не спорю, но объяснить ты можешь? Если ты говоришь, что что-то неправильно - скажи что именно, и как правильно.....
-
А я же не знаю - что неправильно.
Я не знаю, откуда у тебя этот массив взялся.
но считаю, что ситуация, которая привела к такой постановке вопроса - неправильная. можно сделать по-другому.
просто мне в моей практике не приходилось перебирать ассоциативгые массивы "с какого-то места". меня и порядок-то элементов никогда в ассоциативном не интересовал.
По определению, ассоциативный - это не тот, в котором по порядку лежат, а тот, к которому по индексу обращаются.
Кстати, ты варнинг к описанию функции prev читал? может, в нем дело?
-
но считаю, что ситуация, которая привела к такой постановке вопроса - неправильная. можно сделать по-другому.
Возможно. Всегда можно сделать по-другому.
может, в нем дело
У меня нет пустых элементов.
-
Metaller
Сделай так:
print(\'\');
$SomeArray = array ( 1,2,3,4,5,6,7,8,9,23,45,76,89,12,45,5476,876);
$half = sizeof($SomeArray)/2;
$type = 16;
reset($SomeArray);
print_r($SomeArray);
if(isset($type)) {
while(list($key,$val) = each($SomeArray))
{
if ( $key == $type)
{
break;
}
}
if (!prev($SomeArray))
end($SomeArray);
}
////êóñîê õòìë\'ÿ
for($i=0;$i<$half;$i++) {
list($key, $item) = each($SomeArray);
print($key."\\n");
if(isset($type)&&($type!=$key)) continue;
//...................
}
print(\'\');
?>
-
у тебя есть пустой элемент. Конец массива.
-
Я так думаю, (по логике) что на последней итерации в each курсор в массиве опять переходит на начало массива. Соответственно prev не работает.
-
Доктор
Нет. не правда.
Если бы это было так, то конструкция next не возвращала бы FALSE.
К тому же отпала бы необходимость ресетить массив...
-
Прикольно. Посмотрите:
$a=array(0,1,2,3,4,5,6);
echo key($a),"=>",current($a),"
---------------
";
while (list($k,$v)=each($a))
echo key($a),"=>",current($a)," : $k=>$v","
";
echo "
---------------
$k=>$v
",key($a),"=>",current($a),"
---------------
";
foreach ($a as $k=>$v)
echo key($a),"=>",current($a)," : $k=>$v","
";
echo "
---------------
$k=>$v
",key($a),"=>",current($a),"
---------------
";
?>
-
ThE0ReTiC
Спасибо, я дошел точно до такого же решения :-)
RomikChef
А конец массива является его элементом?
-
Металлер, тебе шашечки или ехать?
тебе обязательно чтобы конец массива был его элементом или то, что возвращает prev()
-
man >> If the internal pointer for the array points past the end of the array contents, each() returns FALSE.
есть такая мысль, что когда "индекс в массиве" указывает за последний элемент, то он не знает куда возвращаться... ведь там нет элемента, а следовательно - нет ссылки назад.
-
Antoxa
А вот это, кстати, дельная мысль. Скорее всего, так и есть.
Всем спасибо. Особенно Ромику, что хоть не обозвал никак в этот раз. :)
-
он просто сдержался :)
но я с ним согласен, что ассоциативные массивы совсем не для этого и надо делать по-другому
-
Прикольно, что никто не знает для чего оно делалось, но все говорят, что "ассоциативные массивы не для того". Глупо как-то... Ну даже если они "не для того придумывались", что с того, что их удобно применять оказалось и для "не того"?
-
Доктор
Мда, интересно конечно, чего-то я совсем уже запутался...
Не логично это все по моему...
А вообще стоило тебе хоть маленький комментарий к коду приписать. (И почему у меня "эхи" запятые не переваривают, ну ни в какую)
-
Доктор
почему ты решил, что никто не знает для чего оно делалось? :)
ты просто почитай про алгоритмы. про хеширование, которым это дело реализуется. потом исходники: zend_hash.c, zend_dynamic_array.c, zend_alloc.c, а потом уже говори.
-
Ладно.
Заканчиваем грызню... :)
Тема закрыта.