Forum Webscript.Ru

Программирование => PHP => Тема начата: Metaller от 09 Сентября 2002, 13:47:24

Название: Перебор массива. Чей глюк?
Отправлено: Metaller от 09 Сентября 2002, 13:47:24
Объясните чайнику, это глюк в ДНК или в ПХП :) ?

Ситуация: массив перебирается each\'ем. При определенных условиях из цикла происходит выход брейком.

Потом делается prev и после этого продолжается цикл. По идее, он должен начаться с того элемента, после которого произошел выход из первого цикла. Верно?

Так и происходит. Прев работает, each работает... все ок.
До тех пор, пока не происходит выход после последнего элемента массива. В этом случае прев не работает.

Насколько я понимаю, prev переводит внутренний указатель массива на предыдущий элемент. Следовательно, после того, как each перебрал все элементы массива, prev должен поставить указатель на последний элемент. Или не так?
Так, вот, этого не происходит. Если each дошел до конца массива - prev не работает. Хотя end работает замечательно. В чем может быть глюк? Или я в ман\'е что-то не заметил?

For RomikChef: Плиз, если не можешь ответить по теме - не отвечай вовсе. :)
Название: Перебор массива. Чей глюк?
Отправлено: ThE0ReTiC от 09 Сентября 2002, 13:51:10
Metaller
Код покажи
Название: Перебор массива. Чей глюк?
Отправлено: Metaller от 09 Сентября 2002, 14:01:28
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;
//...................
}

 

Нечто подобное...
Название: Перебор массива. Чей глюк?
Отправлено: Меняздесьдавнонет от 09 Сентября 2002, 14:08:25
А я все-таки выступлю не по теме.
по-моему, ассоциативные массивы как раз и придумывались, чтобы по ним не ползать перебором.
Название: Перебор массива. Чей глюк?
Отправлено: Metaller от 09 Сентября 2002, 14:11:39
А если мне нужно вывести все элементы ассоциативного массива, начиная с какого-то?
Название: Перебор массива. Чей глюк?
Отправлено: Меняздесьдавнонет от 09 Сентября 2002, 14:15:13
Значит, это неправильный массив
Название: Перебор массива. Чей глюк?
Отправлено: Metaller от 09 Сентября 2002, 14:19:52
RomikChef
Ты опять за своё. Я же не спорю, но объяснить ты можешь? Если ты говоришь, что что-то неправильно - скажи что именно, и как правильно.....
Название: Перебор массива. Чей глюк?
Отправлено: Меняздесьдавнонет от 09 Сентября 2002, 14:29:51
А я же не знаю - что неправильно.
Я не знаю, откуда у тебя этот массив взялся.
но считаю, что ситуация, которая привела к такой постановке вопроса - неправильная. можно сделать по-другому.

просто мне в моей практике не приходилось перебирать ассоциативгые массивы "с какого-то места". меня и порядок-то элементов никогда в ассоциативном не интересовал.
По определению, ассоциативный - это не тот, в котором по порядку лежат, а тот, к которому по индексу обращаются.

Кстати, ты варнинг к описанию функции prev читал? может, в нем дело?
Название: Перебор массива. Чей глюк?
Отправлено: Metaller от 09 Сентября 2002, 14:35:48
Цитировать
но считаю, что ситуация, которая привела к такой постановке вопроса - неправильная. можно сделать по-другому.

Возможно. Всегда можно сделать по-другому.

Цитировать
может, в нем дело

У меня нет пустых элементов.
Название: Перебор массива. Чей глюк?
Отправлено: ThE0ReTiC от 09 Сентября 2002, 14:44:26
Metaller
Сделай так:

print(\'\');<br />$SomeArray = array ( 1,2,3,4,5,6,7,8,9,23,45,76,89,12,45,5476,876);<br /><br />$half = sizeof($SomeArray)/2;<br /><br />$type = 16;<br /><br />reset($SomeArray);<br />print_r($SomeArray);<br />if(isset($type)) {<br /> <br /> <br /> while(list($key,$val) = each($SomeArray))<br /> {<br /> if ( $key == $type)<br /> {<br /> break;<br /> }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; if (!prev($SomeArray))<br />&nbsp; &nbsp; end($SomeArray);<br /><br />}<br />////&#234;&#243;&#241;&#238;&#234; &#245;&#242;&#236;&#235;\'&#255;<br /><br />for($i=0;$i<$half;$i++) {<br />&nbsp; &nbsp; list($key, $item) = each($SomeArray);<br />&nbsp; &nbsp; print($key.&quot;\\n&quot;);<br />&nbsp; &nbsp; if(isset($type)&&($type!=$key)) continue;<br />&nbsp; &nbsp; //...................<br />}<br /><br />print(\'\');
?>
Название: Перебор массива. Чей глюк?
Отправлено: Меняздесьдавнонет от 09 Сентября 2002, 14:45:50
у тебя есть пустой элемент. Конец массива.
Название: Перебор массива. Чей глюк?
Отправлено: Доктор от 09 Сентября 2002, 15:12:36
Я так думаю, (по логике) что на последней итерации в each курсор в массиве опять переходит на начало массива. Соответственно prev не работает.
Название: Перебор массива. Чей глюк?
Отправлено: ThE0ReTiC от 09 Сентября 2002, 15:23:58
Доктор
Нет. не правда.
Если бы это было так, то конструкция next  не возвращала бы FALSE.
К тому же отпала бы необходимость ресетить массив...
Название: Перебор массива. Чей глюк?
Отправлено: Доктор от 09 Сентября 2002, 17:47:43
Прикольно. Посмотрите:


$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),"
---------------
";
?>
Название: Перебор массива. Чей глюк?
Отправлено: Metaller от 09 Сентября 2002, 18:37:56
ThE0ReTiC
Спасибо, я дошел точно до такого же решения :-)

RomikChef
А конец массива является его элементом?
Название: Перебор массива. Чей глюк?
Отправлено: Меняздесьдавнонет от 09 Сентября 2002, 19:18:06
Металлер, тебе шашечки или ехать?
тебе обязательно чтобы конец массива был его элементом или то, что возвращает prev()
Название: Перебор массива. Чей глюк?
Отправлено: Antoxa от 09 Сентября 2002, 19:19:39
man >> If the internal pointer for the array points past the end of the array contents, each() returns FALSE.

есть такая мысль, что когда "индекс в массиве" указывает за последний элемент, то он не знает куда возвращаться... ведь там нет элемента, а следовательно - нет ссылки назад.
Название: Перебор массива. Чей глюк?
Отправлено: Metaller от 09 Сентября 2002, 19:23:24
Antoxa
А вот это, кстати, дельная мысль. Скорее всего, так и есть.

Всем спасибо. Особенно Ромику, что хоть не обозвал никак в этот раз. :)
Название: Перебор массива. Чей глюк?
Отправлено: Antoxa от 09 Сентября 2002, 19:32:09
он просто сдержался :)
но я с ним согласен, что ассоциативные массивы совсем не для этого и надо делать по-другому
Название: Перебор массива. Чей глюк?
Отправлено: Доктор от 10 Сентября 2002, 04:00:09
Прикольно, что никто не знает для чего оно делалось, но все говорят, что "ассоциативные массивы не для того". Глупо как-то... Ну даже если они "не для того придумывались", что с того, что их удобно применять оказалось и для "не того"?
Название: Перебор массива. Чей глюк?
Отправлено: rembo от 10 Сентября 2002, 04:34:45
Доктор
Мда, интересно конечно, чего-то я совсем уже запутался...
Не логично это все по моему...
А вообще стоило тебе хоть маленький комментарий к коду приписать. (И почему у меня "эхи" запятые не переваривают, ну ни в какую)
Название: Перебор массива. Чей глюк?
Отправлено: Antoxa от 10 Сентября 2002, 09:29:40
Доктор
почему ты решил, что никто не знает для чего оно делалось? :)
ты просто почитай про алгоритмы. про хеширование, которым это дело реализуется. потом исходники: zend_hash.c, zend_dynamic_array.c, zend_alloc.c, а потом уже говори.
Название: Перебор массива. Чей глюк?
Отправлено: ThE0ReTiC от 10 Сентября 2002, 09:41:26
Ладно.
Заканчиваем грызню... :)
Тема закрыта.