Автор Тема: Перебор массива. Чей глюк?  (Прочитано 7844 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
Перебор массива. Чей глюк?
« : 09 Сентября 2002, 13:47:24 »
Объясните чайнику, это глюк в ДНК или в ПХП :) ?

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

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

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

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

For RomikChef: Плиз, если не можешь ответить по теме - не отвечай вовсе. :)
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #1 : 09 Сентября 2002, 13:51:10 »
Metaller
Код покажи
AS IS...

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
Перебор массива. Чей глюк?
« Ответ #2 : 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;
	
//...................
}



Нечто подобное...
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #3 : 09 Сентября 2002, 14:08:25 »
А я все-таки выступлю не по теме.
по-моему, ассоциативные массивы как раз и придумывались, чтобы по ним не ползать перебором.

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
Перебор массива. Чей глюк?
« Ответ #4 : 09 Сентября 2002, 14:11:39 »
А если мне нужно вывести все элементы ассоциативного массива, начиная с какого-то?
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #5 : 09 Сентября 2002, 14:15:13 »
Значит, это неправильный массив

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
Перебор массива. Чей глюк?
« Ответ #6 : 09 Сентября 2002, 14:19:52 »
RomikChef
Ты опять за своё. Я же не спорю, но объяснить ты можешь? Если ты говоришь, что что-то неправильно - скажи что именно, и как правильно.....
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #7 : 09 Сентября 2002, 14:29:51 »
А я же не знаю - что неправильно.
Я не знаю, откуда у тебя этот массив взялся.
но считаю, что ситуация, которая привела к такой постановке вопроса - неправильная. можно сделать по-другому.

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

Кстати, ты варнинг к описанию функции prev читал? может, в нем дело?

Оффлайн Metaller

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
Перебор массива. Чей глюк?
« Ответ #8 : 09 Сентября 2002, 14:35:48 »
Цитировать
но считаю, что ситуация, которая привела к такой постановке вопроса - неправильная. можно сделать по-другому.

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

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

У меня нет пустых элементов.
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #9 : 09 Сентября 2002, 14:44:26 »
Metaller
Сделай так:

<?
print(\
'<xmp>\');
$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);

}
////&#234;&#243;&#241;&#238;&#234; &#245;&#242;&#236;&#235;\'&#255;

for($i=0;$i<$half;$i++) {
    list($key, $item) = each($SomeArray);
    print($key."\\n");
    if(isset($type)&&($type!=$key)) continue;
    //...................
}

print(\'</xmp>\');
?>
AS IS...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #10 : 09 Сентября 2002, 14:45:50 »
у тебя есть пустой элемент. Конец массива.

Оффлайн Доктор

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 487
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #11 : 09 Сентября 2002, 15:12:36 »
Я так думаю, (по логике) что на последней итерации в each курсор в массиве опять переходит на начало массива. Соответственно prev не работает.

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #12 : 09 Сентября 2002, 15:23:58 »
Доктор
Нет. не правда.
Если бы это было так, то конструкция next  не возвращала бы FALSE.
К тому же отпала бы необходимость ресетить массив...
AS IS...

Оффлайн Доктор

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 487
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Перебор массива. Чей глюк?
« Ответ #13 : 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

  • Мелкое злобное существо
  • Ветеран
  • *****
  • Сообщений: 538
  • +0/-0
  • 2
    • Просмотр профиля
    • http://michael.pp.ru
Перебор массива. Чей глюк?
« Ответ #14 : 09 Сентября 2002, 18:37:56 »
ThE0ReTiC
Спасибо, я дошел точно до такого же решения :-)

RomikChef
А конец массива является его элементом?
Everybody\'s Got A Ticket To Ride Except For Me And My Lightning...

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28