Intereting Posts
Проблема с CodeIgniter с базой данных Идентификатор автотеста H2 в строке php Разделение электронной почты и Интернета на разных серверах: отправьте письмо через PHP на адрес электронной почты в этом домене PHP curl_getinfo ($ ch, CURLINFO_CONTENT_TYPE) не возвращает кодировку как я сортирую следующий объект array / stdclass в php? простой массив в ассоциативный массив, основанный на «дереве каталогов», как значения первого Как взорвать целое число Создать обработчик Catch-All в PHP? Libpuzzle Индексирование миллионов изображений? Как преобразовать объекты HTML, такие как & # 8211; к их эквивалентам символов? Magento – программно создавать пользовательский атрибут продукта через установочный скрипт Необлученное сообщение об ошибке «PDOException» «недопустимое имя источника данных» Как узнать число получателей, открывших электронную почту через google analyttic? Обновите все цены на товары WooCommerce до 2 десятичных знаков в базе данных Как создать вложенный массив PHP из простого многомерного массива

Как найти следующий числовой индекс существующего массива?

Я ищу простой способ получить следующий числовой индекс массива для нового элемента, который также был бы выбран PHP.

Пример 1:

$array = array(); $array[] = 'new index'; 

Для этого случая это будет 0.

Пример 1а:

 $array = array(100 => 'prefill 1'); unset($x[100]); $x[] = 'new index'; не $array = array(100 => 'prefill 1'); unset($x[100]); $x[] = 'new index'; 

Для этого случая это будет 101.

Пример 2:

 $array = array(-2 => 'prefill 1' ); $array[] = 'new index'; 

Это будет 0 снова для этого случая.

Пример 3:

 $array = array(-2 => 'prefill 1', 1 => 'prefill 2' ); $array[] = 'new index'; 

Для этого случая это будет 2.

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

Мне нужно это для собственной реализации массива через SPL, который должен имитировать поведение по умолчанию PHP, если новый элемент добавлен без указания смещения.

Пример 4:

 $array = array(-2 => 'prefill 1', 'str-key-1' => 'prefill 2', 1 => 'prefill 3' , 'str-key-2' => 'prefill 4'); $array[] = 'new index'; 

Это будет 2 для этого случая снова.

Пример 5:

 $array = array(-2 => 'prefill-1', 'str-key-1' => 'prefill-2', 1 => 'prefill-3' , '5667 str-key-2' => 'prefill-4'); $array[] = 'new index'; 

Это было бы и для этого случая.

Обновление: я добавил несколько примеров, чтобы показать некоторые из крайних случаев.

Я не думаю, что необходимая информация подвергается скриптам PHP. Рассматривать:

 <?php $x = array(100 => 'foo'); unset($x[100]); $x[] = 'bar'; var_dump($x); ?> array(1) { [101]=> string(3) "bar" } не <?php $x = array(100 => 'foo'); unset($x[100]); $x[] = 'bar'; var_dump($x); ?> array(1) { [101]=> string(3) "bar" } 

Не было бы никакого способа узнать, что 101 является следующим целым числом, учитывая, что, казалось бы, пустой массив, до добавления элемента.

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

Способ 1:

Используйте end для продвижения массива до конца. Получить key от этого элемента. Наконец, добавьте 1 к нему, чтобы получить индекс следующего элемента. Как это:

 $array [ ] = 'I'; $array [4] = 'Like'; $array [ ] = 'Turtles'; end($array); $last = key($array); $nextindex = $last + 1; echo $nextindex; 

Эти результаты:

6

Этот метод не выполняется в случаях, когда последний индекс не является наибольшим или строкой (как указано в комментариях). Таким образом, в этих случаях есть этот лучший метод 2 .


Способ 2:

Этот метод работает с отрицательными и строковыми индексами:
Вы можете получить array_keys и сделать max , а затем +1 . Как это:

  $array = array(-2 => 'prefill 1', 'str-key-1' => 'prefill 2', 1 => 'prefill 3' , 'str-key-2' => 'prefill 4'); echo max(array_keys($array)) + 1; 

Это правильно выводит:

2

В таблице хэша zend есть элемент nNextFreeElement , который содержит номер, который вы ищете. Каждый раз, когда элемент добавляется, это поле обновляется до максимального значения самого себя и индекса + 1 .

 ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC) { ... if ((long)h >= (long)ht->nNextFreeElement) { ht->nNextFreeElement = h < LONG_MAX ? h + 1 : LONG_MAX; } ... } 

Мне кажется, что PHP получает следующее положительное число после максимального значения индекса.

Если все остальное не удается, вы можете просто протестировать копию.

 // Since PHP passes by copy, we don't even need to explicitly copy. function get_next_key($copy) { $copy[] = 'blah'; end($copy); return key($copy); } $key = get_next_key($array);