Как узнать максимальный индекс в массиве?

Tofik

Новичок
Как узнать максимальный индекс в массиве?

Как узнать максимальный индекс в массиве?
 

Tofik

Новичок
массив может быть таким:

Array
(
[0] => фыв
[1] => фывфываыф
[3] => фывп
[4] => фвпыв
[6] => аврпа
[8] => пр
[9] => ролрол
)
 

Фанат

oncle terrible
Команда форума
sakon
вопроса ты не понял.

Tofik
можно попробовать max(array_keys(array))
только зачем тебе это?
 

Tofik

Новичок
хочу добавить новое значение в $_SESSION['id'].

$_SESSION['id'][]=$id выкидывает ошибку:
Fatal error: [] operator not supported for strings in ....
 

Tofik

Новичок
Как это ни кажется странным, но в массиве $_SESSION нельзя использовать числовые индексы - $_SESSION[1], $_SESSION['10'] - cессии работать не будут.
А у меня массив $_SESSION['id'] ....
 

Фанат

oncle terrible
Команда форума
хочу добавить новое значение в $_SESSION['id'].
какой ужас.
вместо того, чтобы исправить кривой код, этот человек начинает заниматься глупостями.
если у тебя $_SESSION['id'] НЕ МАССИВ, то и максимального значения у него никакого НЕТУ!

Что такое у тебя $_SESSION['id']? Какого типа эта переменная? Какое знаение имеет?
 

Tofik

Новичок
$_SESSION['id'] - это массив.... двумерный.

$_SESSION['id'][0]=176
$_SESSION['id'][4]=123

array_push выдаёт ошибку, поэтому я и ищу максимальный индекс
 

Фанат

oncle terrible
Команда форума
$_SESSION['id'] - это массив
глупость.
тебе пхп пишет , что это не массив.
Сделай var_dump($_SESSION['id']); и убедись
где это он двумерный? где второе измерение? Я только одно вижу.

-~{}~ 06.06.05 20:06:

array_push выдаёт ошибку, поэтому я и ищу максимальный индекс
тебе я уже один раз сказал. НЕ ИНДЕКС НАДО ИСКАТЬ, а МАССИВО ПЕРЕМЕННУЮ СДЕЛАТЬ
чтобы всё заработало

-~{}~ 06.06.05 20:08:

кстати.
раз ты просто добавляешь единицу, то почему ты отказался от варианта sakon?
Нет, оно всё равно работать не будет, но мне просто интересно. к чему ты привёл массив м ключами 134689? он здесь при чём?
 

DiMA

php.spb.ru
Команда форума
Спустя 10 лет я, пожалуй, отвечу на этот вопрос. А это в Яндексе и здесь не найти правильный ответ .-)

Код:
            $x=array(3=>3, 4=>4, 99=>99);
            $x[]=666;
            end($x);
            pr('key=', key($x), 'value=', $x[key($x)]);

            $x[]=777;
            end($x);
            pr('key=', key($x), 'value=', $x[key($x)]);
end() - сдвигает мифический указать массива в конец массива
key() - получает ключ по мифическому указателю

Т.о. вывод этого кода:

key=100
value=666
key=101
value=777

Проблема возникает, когда есть массив, индексный. Нам совершенно не важны индексы. Но важен их порядок, когда массив является очередью. Т.е. чтобы одна часть кода могла накидать записей, другая поудалять произвольные позиции, создав дырки в индексах и чтобы при этом не нарушился порядок (удаление случайного элемента и добавление в конец повторяются много раз). Собственно проблема получения последнего вставленного индекса. Использовать array_keys подсознательно не хочется, т.к. она генерит новый массив, что, наверно, более прожорливее, чем функция key(), выдающая всего одно число. Аналог LAST_INSERT_ID.
 

DiMA

php.spb.ru
Команда форума
Наверно тем, что я и другие чайники не знают про такие классы. Еще тем, что куча народа с Яндекса ломится в эту тему узнать именно про массивы (каждый 2й день по заходу). Удаление не из конца или начала очереди, а произвольно. Т.е. это не совсем очередь, как я выше написал. Пример задачи - массив сокетов. Они появляются, удаляются, обновляются соседние данные в элементе сокета (буфер, счетчики и т.д.), обходятся в массиве (в соответствии с номером, от минимума до максимума - важно). Тот класс имеет все эти методы? Они удобнее и короче в написании, чем это? Вряд ли:

$x[]=array(...)
$x[$id]['key']=value
foreach ($x)
unset($x[$id])

А зачем следить за упорядоченностью? $x[] - именно этим сам и занимается. Но, вопрос хороший :) Я проверил, при unset() последнего элемента и добавлении $x[] - выделяется новый ID, а не с 0 или с повтором ранее выданного индекса. В общем, мне в падлу какие-то объекты изучать, если простой массив все позволяет.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>Тот класс имеет все эти методы?
конечно, это стандартная задача, она реализована почти в ядре php 5 лет назад
>Они появляются,
$sockets->add($val) или $sockets[] = $val;
>удаляются,
unset($sockets[$key]);
>обновляются соседние данные в элементе сокета (буфер, счетчики и т.д.),
причем, инкапсулирует эти данные
$sockets->updateSocketData($index,$data);
>обходятся в массиве (в соответствии с номером, от минимума до максимума - важно).
конечно, implements Iterator
>Они удобнее и короче в написании, чем это?
добавь проверки - будет короче раз в 10, разница в дебаге

>А зачем?
затем же, зачем и unique key в базе -- например, чтобы
  • $sockets[$key] = $val; выдавало exception,
  • $sockets[false] не вернул 0й элемент,
  • array_sort можно было сделать только явно экспортировав данные из объекта,
  • кто-нибудь мог написать function (SocketsList $list) и заниматься своей задачей, не проверяя валидность
>unset() последнего элемента и добавлении $x[] - выделяется новый ID, а не с 0
это называется разработкой на соглашениях ($x[] = писать можно, $x[$y] = нельзя), я сторонник явного документирования кодом и использования нативных инструментов, специально созданных для решения задач

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

WMix

герр M:)ller
Партнер клуба
когда нужен последний элемент это больше стек чем очередь
 
Последнее редактирование:

Redjik

Падаван
Наверно тем, что я и другие чайники не знают про такие классы. Еще тем, что куча народа с Яндекса ломится в эту тему узнать именно про массивы (каждый 2й день по заходу). Удаление не из конца или начала очереди, а произвольно. Т.е. это не совсем очередь, как я выше написал. Пример задачи - массив сокетов. Они появляются, удаляются, обновляются соседние данные в элементе сокета (буфер, счетчики и т.д.), обходятся в массиве (в соответствии с номером, от минимума до максимума - важно). Тот класс имеет все эти методы? Они удобнее и короче в написании, чем это? Вряд ли:

$x[]=array(...)
$x[$id]['key']=value
foreach ($x)
unset($x[$id])

А зачем следить за упорядоченностью? $x[] - именно этим сам и занимается. Но, вопрос хороший :) Я проверил, при unset() последнего элемента и добавлении $x[] - выделяется новый ID, а не с 0 или с повтором ранее выданного индекса. В общем, мне в падлу какие-то объекты изучать, если простой массив все позволяет.
так это решается очередью с приоритетами http://php.net/manual/en/class.splpriorityqueue.php

когда нужен последний элемент это больше стек чем очередь
FIFO, LIFO очереди же?
 

DiMA

php.spb.ru
Команда форума
простой топик сразу собрал почти всех любителей программировать ради программирования .-)
 

fixxxer

К.О.
Партнер клуба
Не совсем :) Если речь о том же массиве сокетов, большом и динамическом, для какого-нибудь epoll(), то накладные расходы на тяжелый zval и реаллокацию при переходе размера массива через степень двойки могут оказаться критичными по памяти и/или нестабильности времени ответа. SPL-структуры сложнее в использовании, но стабильнее по cpu и потребляют меньше памяти. Другое дело, что подобные задачи редко решают на php.
 
Сверху