powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / номер получаемого элеменат из foreach
25 сообщений из 26, страница 1 из 2
номер получаемого элеменат из foreach
    #39094465
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В языке PHP есть удобная конструкция чтобы пробежаться по всему массиву:
Код: php
1.
2.
3.
foreach ($arr as $value) {
    echo "Value: $value<br>\n";
}


А можно во время выполнения получить порядковый номер элемента к которому обращаюсь без создания собсвенного счётчика?
Конечно, при нескольких строчках не сложно дописать:
Код: php
1.
2.
3.
4.
5.
$n=1;
foreach ($arr as $value) {
    $n++;
    echo "Number: $n, Value: $value<br>\n";
}


но ведь foreach сам знает к какому элементу обращается, может можно получить его порядковый номер без введения новых переменных?
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094493
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky, документацию нынче не модно читать?

Код: php
1.
2.
foreach (array_expression as $key => $value)
    statement
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094502
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причём тут индексный ключ? Я спросил про порядковый номер элемента в массиве...
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094506
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, точно документацию нынче читать не модно :)
Вот спросят Вас на собеседовании о том, что такое массив в PHP, вот Вы в лужу и сядете.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094519
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так надеюсь понятнее будет:

Код: php
1.
2.
3.
4.
5.
$array = array("a", "b", "c", "d", "f");

foreach ($array as $index => $value) {
  print "$index => $value; ";
}


Если хотите, то проверьте на http://phpfiddle.org/
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094522
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я по секрету скажу foreach даже не с массивом работает, а с его копией.
По крайней мере так было в 1999 году, когда я читал документацию.
Или что-то изменилось за эти годы?
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094525
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky, может Вы по секрету ещё и код инициализации своего массива покажете? А то прям интрига :)
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094528
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы наверно забываете что у вас массив может быть объявлен как
Код: php
1.
$array = array(1=>"a", 100=>"b", -100=>"c");
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094530
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky, у меня массив объявлен так как я написал выше :) А у Вас?
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094532
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, не будем гадать. Вариант номер два:

Код: php
1.
2.
3.
4.
5.
$array = array(10 => "a", 20 => "b", "vasya" => "c", "petya" => "d", "f");

foreach (array_values($array) as $index => $value) {
  print "$index => $value; ";
}
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094535
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется я написал... Или вы уже поняли свою ошибку?
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094541
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Номер элемента в массиве является как бы бессмысленной вещью, поскольку массивы могут быть обычные, ассоциативные, разряженные, смешанные. А после сортировки вообще получите другой элемент.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094545
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"По поводу знает к какому элементу обращаться"-это не так. foreach просто сдвигает указатель в стеке.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094546
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyМне кажется я написал... Или вы уже поняли свою ошибку?Прямого ответа я не увидел :) А ошибка моя в том, что вообще вступил в диалог с таким занудой, как Вы.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094548
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял что вы хотите найти конкретное решени для конкретно моего примера (хотя я писал: " Конечно, при нескольких строчках не сложно дописать ", намекая что код большой и не из-за хорошей жизни приходится искать решения как избавиться от лишних переменных).
Признаю что Вы нашли очень красивое решение задачи...
Но ведь я могу и сам использовать $key в своём foreach:

Код: php
1.
2.
3.
4.
5.
6.
$arr = array(1=>"a", 100=>"b", -100=>"c");
$n=1;
foreach ($arr as $key=>$value) {
    $n++;
    echo "Number: $n, Key: $key, Value: $value<br>\n";
}


В таком случае можно избавиться от переменной $n?
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094552
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
напишите свою функцию и не парьтесь
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094563
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kunaksergey"По поводу знает к какому элементу обращаться"-это не так. foreach просто сдвигает указатель в стеке.Причём не просто "в стеке массива", а как уже говорил - сдвигает указатель в стеке КОПИИ массива (в то время как указатель самого массива не меняется). По этому и возник вопрос к гуру, а можно ли получить какую-нибудь информацию в процессе работы foreach. А мне в ответ занудно мануал скармливали...
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094566
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyПричём не просто "в стеке массива", а как уже говорил - сдвигает указатель в стеке КОПИИ массива (в то время как указатель самого массива не меняется). По этому и возник вопрос к гуру, а можно ли получить какую-нибудь информацию в процессе работы foreach.А какой смысл выводить во внешнюю по отношению к функции среду значения внутренних её переменных? Под отладчиком наверняка видно будет, но это не то, что Вам надо, скорей всего.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094573
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyсдвигает указатель в стеке КОПИИ массива (в то время как указатель самого массива не меняется)Есть некоторое сомнение на этот счёт. Копия - дело накладное. Даже после $b = $a копия значения переменной не будет создана до тех пор, пока $b не будет изменена. Возможно, в далёком 1999 году и работали с копией, но сейчас вряд ли.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094650
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, действиетельно. Посмотрел, раньше было:
автор Примечание: Обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, указатель массива не изменяется, как при работе конструкции each(), и изменения в возвращаемом элементе массива не влияют на массив-оригинал.

а теперь:
авторТак как оператор foreach опирается на внутренний указатель массива, его изменение внутри цикла может привести к непредсказуемому поведению.
То есть, раньше была копия массива, а теперь копия указателя.

Впрочем это не меняет сути вопроса. От развивающегося языка программирования ожидаешь не столько изменения логики привычных функций сколько добавление самих этих функций. И за 15 лет вполение ожидаемой была бы функция счётчика, ведь часто при прогонке массива используется нумерация списка.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094669
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSkyа теперь:
авторТак как оператор foreach опирается на внутренний указатель массива, его изменение внутри цикла может привести к непредсказуемому поведению.
То есть, раньше была копия массива, а теперь копия указателя.Неа, не копия. Извольте поглядеть на вывод:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?php

$a = array(1,2,3,4,5,6,7);

foreach($a as $v) {
    echo $v, "\n";
    if($v == 3) break;
}

echo next($a), "\n";
echo next($a), "\n";
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094732
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Удивлён. Признаю вашу правату.
Но это означает что тем более просто было бы сделать системную функцию показывающую порядковый нормер текущего элемента в массиве. Причём универсальную, что для foreach, что для next.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094740
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky,

Не только для них, с указателем массива работают и другие функции. Однако, пол-пути к Вами желаемому разработчики уже сделали, написав функции key() и current(). Видимо, посчитали это достаточным.
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39094741
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
InterSkyvkle,

Удивлён. Признаю вашу правату.
Но это означает что тем более просто было бы сделать системную функцию показывающую порядковый нормер текущего элемента в массиве. Причём универсальную, что для foreach, что для next.
Если не нравится стандартное поведение, реализуйте свой итератор
http://php.net/manual/ru/language.oop5.iterations.php
...
Рейтинг: 0 / 0
номер получаемого элеменат из foreach
    #39095711
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Key и Current просто возвращают текущий ключь и текущий элемент массива, по сути тоже самое что я получаю при foreach ($arr as $key=>$value)
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / номер получаемого элеменат из foreach
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]