Автор Тема: индекс массива в foreach  (Прочитано 7545 раз)

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

Оффлайн Forza

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 288
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« : 06 Июня 2004, 13:47:55 »
Каким образом можно в цикле foreach обратиться к индексу (номеру) текущего обрабатываемого элемента массива? Может быть, какая-нибудь временная переменная это хранит?

p.s. Попробовал поискать в Яндексе ответ по ключевым словам – пока не нашёл.
p.s.2. Я в курсе, что это реализуемо с помощью for. Но если использовать foreach, то всё выглядело бы красивей и компактней.

Оффлайн synthez

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 104
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #1 : 06 Июня 2004, 17:04:04 »
$c = 0;
foreach (@array)
{
  $array[$c]; # что-нить с ним делаем
  $c++;
}

или не так?

а зачем тебе вообще foreach, если можно обойтись другими управляющими структурами?
Software  like sex - it\'s better when it\'s free

Оффлайн Forza

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 288
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #2 : 06 Июня 2004, 17:57:50 »
У меня есть два массива одинаковой длины с длинными громоздкими названиями, т.к. они ещё в хеш хешей засунуты. :)
Поэтому, чтобы их гонять по  for, надо сначала в условии завершения указать их длину, а потом в теле цикла ссылаться на их значения, выписывая длинющие штуки типа $hash{$table}{detail}[$i].
Если же пусть цикл foreach по одному из массивов и как-нибудь догадываться об индексе текущего элемента, таких конструкций, как выше, в тексте было бы меньше.

В крайней случае буду сам вести счётчик, как ты предложил.

Оффлайн Forza

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 288
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #3 : 06 Июня 2004, 19:37:11 »
Или, может быть, можно "засунуть" в foreach $var (@mas) упоминание двух массивов и двух переменных, которые принимают значения элементов массивов с одинаковыми индексами?
А?

Т.е. мне надо покрасивее оформить синхронный перебор значений двух (а иногда и трёх :)) массивов.

Оффлайн synthez

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 104
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #4 : 06 Июня 2004, 19:51:11 »
Forza
массивы всегда одинаковой длины?
Software  like sex - it\'s better when it\'s free

Оффлайн synthez

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 104
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #5 : 06 Июня 2004, 22:21:53 »
если массивы разные, то надо получить длину того который подлинее и также обработать, например:


foreach $n (0..$end)
{
   
# действия над элементами массивов с одинаковым индексом
   
...
   
$array1[$n]
   
$array2[$n]
   ....
}
« Последнее редактирование: 06 Июня 2004, 22:33:11 от synthez »
Software  like sex - it\'s better when it\'s free

Оффлайн Forza

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 288
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #6 : 06 Июня 2004, 23:11:48 »
synthez, да, массивы одинаковой длины.
То, что ты предлагаешь, будет работать, как и самостоятельный инкремент счётчика в цикле foreach (что предлагалось выше).
Просто я думал и надеялся :), что есть какой-нибудь простой и удобный способ для синхронного перебора нескольких массивов. Это или указание их обоих в заголовке foreach, или доступ к индексу массива через какую-нибудь временную переменную.

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
индекс массива в foreach
« Ответ #7 : 07 Июня 2004, 13:26:00 »
Forza
Не понятно, чего ты в итоге хочешь добиться, но вот... может поможет:
my @array1 = (1, 4, 2, 3);
my @array2 = (4, 3, 2, 1);

print \'Before: \', join(\', \', @array2), "\\n";

[b]@array2[/b] = map { $array1[$_] != $array2[$_] ? $array1[$_] : $array2[$_] } 0 .. [b]$#array1[/b];

print \'After: \', join(\', \', @array2), "\\n";
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
индекс массива в foreach
« Ответ #8 : 07 Июня 2004, 15:23:13 »
Forza



# Вариант 1

for my $i (0..@array1 1) {
   print 
$array1[$i];
   print 
$array2[$i];
}

# Вариант 2

for (my $i 0$i < @array1$i++) {
   print 
$array1[$i];
   print 
$array2[$i];
}

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
индекс массива в foreach
« Ответ #9 : 07 Июня 2004, 17:33:57 »
Вариантов тьма... :
# Вариант 3
$i=0;
while (@array1->[$i]) {
   print $array1[$i];
   print $array2[$i];
   $i++
}

# Вариант 4

for (my $i = 0; @array1->[$i]; $i++) {
   print $array1[$i];
   print $array2[$i];
}

#Вариант 5

$i=0;
for $el(@array1)
{
   print $el;
   print $array2[$i];
   $i++
}

и т.д.
:)
And no religion too...

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
индекс массива в foreach
« Ответ #10 : 07 Июня 2004, 17:45:42 »
synthez

Цитировать
foreach $n (0..$end)
{
...


Кстати, и что это такое? Сам найдешь ошибку или подсказать???

Оффлайн synthez

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 104
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #11 : 07 Июня 2004, 18:11:43 »
foreach (0..$end-1) так?
Software  like sex - it\'s better when it\'s free

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
индекс массива в foreach
« Ответ #12 : 07 Июня 2004, 18:15:41 »
synthez
Ну а теперь давайте играть в угадалки... :)
нет не так...
And no religion too...

Оффлайн synthez

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 104
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #13 : 07 Июня 2004, 18:16:46 »
а если так :


$end 
= $#array;

foreach $n (0..$end)
{ ...


правильно?
Software  like sex - it\'s better when it\'s free

Оффлайн synthez

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 104
  • +0/-0
  • 0
    • Просмотр профиля
индекс массива в foreach
« Ответ #14 : 07 Июня 2004, 18:22:28 »
Phoinix
Я тебя не понял? =)
Ну давай подскажи как правильнее
Software  like sex - it\'s better when it\'s free

 

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