Доступ к последним значениям с помощью отрицательных ключей

hell0w0rd

Продвинутый новичок
Начав учить руби, для общего развития так сказать, увидел интересную фичу:
PHP:
arr = [1, 2, 3]
puts arr[-1] // 3
arr[-1] = 0
puts arr[-1] // 0
Такое поведение массивов мне очень понравилось и сделал простенькую реализацию на php
На сколько знаю тут переодически появляются разработчики ядра, скажите, возможно ли такое пропихнуть в ядро, хотя бы в виде итератора, хотя было бы не плохо видеть такое поведение в нативном массиве, ведь и правда удобно
 

С.

Продвинутый новичок
Во-первых, в РНР все массивы асссоциативные и это в них в общем случае не проходит.
Во-вторых, что такого интересного в этой фиче?
 

hell0w0rd

Продвинутый новичок
С.
1) В общем - это каком? Часто массивы используются именно с ключами в виде чисел
2) Ну как минимум количество кода:
PHP:
$arr[count($arr)-1];
против
PHP:
$arr[-1];
 

С.

Продвинутый новичок
Ты наверное с ума сойдешь от этого:
PHP:
$arr= array('a','b','c');
unset($arr[1]);
print_r($arr);
 

Вурдалак

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

Да и потом, конкретно в таком виде, естественно, никто не пропустит фичу, ибо $arr[-1] вполе законный способ обращения и сегодня.
 

hell0w0rd

Продвинутый новичок
Вурдалак
PHP:
if (!$this->offsetExists($key) && is_int($key) && $key < 0) {
Там изначально проверка на существование.
По идее такой сахар нужен только когда не удаляешь ключи в где-нибудь, потому что если тебе нужно предпоследнее значение, без сахара также его невозможно получить, а бывают ситуации когда нужны именно последние значения
 

Вурдалак

Продвинутый новичок
hell0w0rd, не, такое никто не пропустит, потому что ты полагаешься на существование элемента, нарушение инкапсуляции. Есть зависимость от содержимого массива, а программиста оно не волнует.

Другими словами, я буду ожидать
PHP:
$this->assertEquals(end($arr), $arr[-1]);
а выполняться будет не всегда.
 

WMix

герр M:)ller
Партнер клуба
PHP:
return $idx < 0 ? array_reverse($arr)[abs($idx)-1] : $arr[$idx];
 

WMix

герр M:)ller
Партнер клуба
нет, просто подумал что смысла в этом нет..
 
Сверху