[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ключи массива
ToNiC
Вопрос следующий
Есть некий массив $part_numbers. Массив генерируется полностью автоматически. На определенном этапе я перебираю его с помощью foreach ($part_numbers as $key=>$val) { код...}
Перебор ичом единственный реально подходящий, другие могут вызывать ошибки. Но внутри этого перебора мне нужно узнавать ключ следующего элемента (для работы другого скрипта, не связанного с перебором). Как правильно это сделать?
Ключи даю изначально по порядку, но $key+1 не покатит, юзер может легко удалить любой из элементов и порядок пропадет.
Засматриваюсь на reset current и next, но либо я не совсем понимаю принцип их работы, либо вытягивание следующего ключа этим методом подразумевает еще один перебор массива параллельно с перебором each что вроде-как не правильно и не рационально.

Какой самый нормальный способ узнать ключ следующего элемента массива при переборе foreach?
если таки с помощью reset current и next то подскажите как именно сделать это правильно.

P.S.: узнавать след. ключ мне нужно всего 1 раз и когда именно я не знаю, потому и не радует параллельный перебор.



Спустя 32 минуты, 47 секунд (26.08.2010 - 12:41) linker написал(а):
reset, current, next, prev ничего не перебирают, они просто перемещают внутренний указатель в массиве. Если массив генерирует, то я очень сомневаюсь, что пользователь сможет что-то удалить во время перебора.

Спустя 20 минут, 20 секунд (26.08.2010 - 13:01) ToNiC написал(а):
Цитата (linker @ 26.08.2010 - 09:41)
reset, current, next, prev ничего не перебирают, они просто перемещают внутренний указатель в массиве. Если массив генерирует, то я очень сомневаюсь, что пользователь сможет что-то удалить во время перебора.

Пользователь сможет.

Этот массив это ветка сессии с которой юзер работает в 5 шагов. Если, допустим, он ошибется при вводе данных, то я я даю возможность в интерфейсе удалить одну из веток(элементов массива) в процессе.

И reset, current, next, prev перебирают:


for (Reset($part_numbers); ($k = key($part_numbers)); Next ($part_numbers));
echo "$k = $part_numbers[$k] <br>";


И, собственно, в чем ответ заключается?

Спустя 2 минуты, 28 секунд (26.08.2010 - 13:04) ToNiC написал(а):
Может я не там тему создал?

Спустя 53 минуты, 11 секунд (26.08.2010 - 13:57) linker написал(а):
Ну попробуй совместить foreach(), each() и prev(). Первый перебирает массив по-порядку, второй возвращает пару ключ-значение и смещает внутренний указатель вперед, третий возвращает его обратно. Но лично мне такой вариант не нравится.

Спустя 17 минут, 25 секунд (26.08.2010 - 14:15) ToNiC написал(а):
Цитата (linker @ 26.08.2010 - 10:57)
Ну попробуй совместить foreach(), each() и prev(). Первый перебирает массив по-порядку, второй возвращает пару ключ-значение и смещает внутренний указатель вперед, третий возвращает его обратно. Но лично мне такой вариант не нравится.

Вот и я так думаю. Тоже пока других вариантов не вижу. И это при том, что мне тоже не нравится. Я вот и спросил в надежде, что кто-то более подходящий вариант подскажет. Или хоть идейку подкинет. Интуитивно чувствую, что можно лучше написать, но как...

Спустя 27 минут (26.08.2010 - 14:42) Nikitian написал(а):
Ещё вариант: array_reverse($arr,true); А далее тем же foreach:

$nextkey=false;
foreach($arr as $key=>$value){
//делаете что-то

$nextkey=$key;
}

Т.е. в этом случае задача сводится к узнаванию предыдущего ключа, что логично проще, т.к. итерация уже произведена и следующий (после реверса предыдущий) ключ известен.

Спустя 2 часа, 9 минут, 31 секунда (26.08.2010 - 16:51) ToNiC написал(а):
Готово. Решил не юзать метод с указателем массива.
Дальше пишу как я решил проблему, но если вам это не нужно не читайте, мозги свернутся.
В момент когда нужен ключ следующего элемента массива я считываю ключи моего массива в отдельный массив и по ним делаю еще один foreach c проверкой на наличие следующего ключа в массиве с ключами. Если да - вытягиваю его значение, которое и будет след. ключем основного массива.
Ну и маразм.... Короче суть в том чтобы ключи массива с которым работаем слить в отдельный массив и дальше работать с ним. Выйдет что-то типа такого:
наш массив: array (0=>"any", 1=>"true", 2=>"man" 5=>"some", "хрень"=>"полная хрень")
забираем в отдельный массив ключи: $keys=array_keys(наш массив);
теперь имеем массив с ключами вида
array (
0=>0,
1=>1,
2=>2,
3=>5,
4=>"хрень'
)

ну а дальше с ним можно делать что угодно. и мы точно знаем что тут ключи идут по порядку(то бишь как в моем случае, узнать след. ключ основного массива, берем ключ[ключа]+1). метод прокатит и с ассоциативными массивами. это кончено велосипед, при чем не универсальный, но оригинала я не нарыл) может поможет кому. Но я делаю это только один раз. Если постоянно нужно выдергивать след. ключ то лучше потанцевать с указателем.

Спустя 11 минут, 54 секунды (26.08.2010 - 17:03) Nikitian написал(а):
ToNiC
Мой вариант сделать не пробовали? В нём вроде никаких велосипедов и вложенных циклов нет.

Спустя 4 минуты, 5 секунд (26.08.2010 - 17:07) ToNiC написал(а):
Цитата (Nikitian @ 26.08.2010 - 14:03)
ToNiC
Мой вариант сделать не пробовали? В нём вроде никаких велосипедов и вложенных циклов нет.

Если честно то к моменту когда прочитал ваш пост уже все сделал. Но в принципе я суть не уловил. Можно подробнее? Желательно с примером. Мне вот кажется что мой предыдущий тоже мало кто поймет) Если он рабочий и более рациональный я с удовольствием применю его. Но пока не въехал(

Спустя 12 минут, 18 секунд (26.08.2010 - 17:19) Nikitian написал(а):
<?php
//Заполняем исходный массив
for($i=0;$i<10;$i++)$arr[mt_rand(0,100)]=mt_rand(0,100);
echo'Исходный массив: <pre>'.print_r($arr,true).'</pre><br />';
$arr=array_reverse($arr,true);
$out=$next=array();
foreach($arr as $key=>$value){
//Костыль с выводом через массив, чтобы было наглядно, т.к., как я понял, порядок обхода исходного массива не важен
$out[]='<div>Текущий элемент '.$key.', значение: '.$value.'. Следующий элемент: '.(sizeof($next)==0?'Не существует' : ($next['key'].', значение: '.$next['value'])).'</div>';
$next=array(
'key'=>$key,
'value'=>$value
);
}
$out=array_reverse($out);
echo implode($out);


Вывод
Исходный массив:

Array
(
[9] => 15
[31] => 84
[0] => 6
[6] => 78
[97] => 82
[79] => 92
[57] => 51
[87] => 8
[26] => 98
[64] => 89
)


Текущий элемент 9, значение: 15. Следующий элемент: 31, значение: 84
Текущий элемент 31, значение: 84. Следующий элемент: 0, значение: 6
Текущий элемент 0, значение: 6. Следующий элемент: 6, значение: 78
Текущий элемент 6, значение: 78. Следующий элемент: 97, значение: 82
Текущий элемент 97, значение: 82. Следующий элемент: 79, значение: 92
Текущий элемент 79, значение: 92. Следующий элемент: 57, значение: 51
Текущий элемент 57, значение: 51. Следующий элемент: 87, значение: 8
Текущий элемент 87, значение: 8. Следующий элемент: 26, значение: 98
Текущий элемент 26, значение: 98. Следующий элемент: 64, значение: 89
Текущий элемент 64, значение: 89. Следующий элемент: Не существует

Спустя 11 минут, 41 секунда (26.08.2010 - 17:31) ToNiC написал(а):
Nikitian
Вот. Это круто. Спасибо!
Для моего случая метод отличный. Его и заюзаю скорее всего.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.