Відповіді:
Рішенням буде використання комбінації end
та (цитування) :key
end()
переміщує внутрішній покажчик масиву на останній елемент і повертає його значення. key()
повертає індексний елемент поточної позиції масиву. Отже, така частина коду, як ця, повинна зробити трюк:
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
end($array); // move the internal pointer to the end of the array
$key = key($array); // fetches the key of the element pointed to by the internal pointer
var_dump($key);
Виведе:
string 'last' (length=4)
тобто ключ останнього елемента мого масиву.
Після цього внутрішній покажчик масиву буде в кінці масиву. Як зазначено в коментарях, ви можете запустити reset()
масив, щоб повернути вказівник на початок масиву.
reset()
) ;; але ви праві, вказуючи на цю функцію, яка може бути корисною.
array('a', 'b', 'c', 'd', 'a')
нього буде повертати ключ 0 , а не 4.
Хоча end()
здається, що це найпростіше, але це не найшвидше. Швидша і набагато сильніша альтернатива array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Як свідчать тести , на масиві з 500000 елементами це майже в 7 разів швидше!
end($arr);$key = key($arr);reset($arr);
проти (б) $key = key(array_slice($arr,-1,1,true));
... в результаті чого end()
МНОГО швидше! end () = 0,05326 секунд, array_slice = 8,506 секунди ... так ??
end()
найшвидший, тому що його можна отримати з дуже простої C-функції, наприклад:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
на останній елемент. Створення end()
майже О (1). :-)
я віддаю перевагу
end(array_keys($myarr))
end((array_keys($myarr)))
щоб обійти повідомлення.
Оскільки PHP 7.3 (2018) для цього існує (нарешті) функція: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
виведе
orange
Просто використовуйте: echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
який є цікаво, але не годиться для бізнесу, коли ви перебуваєте на часовому бюджеті
$a[1] = 1; $a[5] = 5; $a[0] = 0;
то у вас буде масив з ключами (1, 5, 0) у такому порядку. count($a)
дасть 3 і $a[2]
не визначено. Це, звичайно, не дає вам 5 назад.
Не знаєте, чи буде це швидше чи ні, але здається, що це зробити простіше так, і ви уникнете помилки, не переходячи у функції до кінця () ...
просто потрібна була змінна ... не велика справа, щоб написати ще один рядок коду, а потім зняти його, якщо потрібно.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
Станом на PHP7.3 ви можете безпосередньо отримати доступ до останнього ключа в (зовнішній рівень) масиву з array_key_last ()
Очевидно, велика частина дебатів на цій сторінці лягає спати. Це найкращий виконавець, який не має жодних побічних ефектів, і є прямим, інтуїтивним методом одноразового виклику, щоб забезпечити саме те, що прагне це питання.
Приблизний орієнтир як доказ: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015
* тестовий масив містить 500000 елементів, мікрочасові повторювані 100x, а потім усереднені та помножені на 1000, щоб уникнути наукових позначень. Заслуга @MAChitgarha за початковий показник, прокоментований під відповіддю @ TadejMagajna .
Це означає, що ви можете отримати значення підсумкового ключа без:
Ця функція давно назріла, і ласкаво просимо доповнення до поясу інструментів функції масиву, що покращує продуктивність, уникає небажаних побічних ефектів, а також забезпечує чистий / прямий / інтуїтивний код.
Ось демонстрація :
$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
echo "please upgrade to php7.3";
} else {
echo "First Key: " , key($array) , "\n";
echo "Last Key: " , array_key_last($array) , "\n";
next($array); // move array pointer to second element
echo "Second Key: " , key($array) , "\n";
echo "Still Last Key: " , array_key_last($array);
}
Вихід:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
Деякі примітки:
array_key_last()
- це функція зведення братів array_key_first () .null
якщо масив порожній.array_value_first()
та сестер ( & array_value_last()
) також запропонували б невігласовому доступу до елементів завантаження, але вони, очевидно, не змогли зібрати достатню кількість голосів, щоб ожити.Ось кілька релевантних сторінок, які обговорюють нові функції:
ps Якщо хтось зважує деякі інші методи, ви можете звернутися до цієї невеликої колекції порівнянь: ( Демо )
Duration of array_slice() + key(): 0.35353660583496 Duration of end() + key(): 6.7495584487915 Duration of array_key_last(): 0.00025749206542969 Duration of array_keys() + end(): 7.6123380661011 Duration of array_reverse() + key(): 6.7875385284424 Duration of array_slice() + foreach(): 0.28870105743408
Спробуйте використовувати функції array_pop та array_keys наступним чином:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
працює на повернене значення, array_keys()
а не на початковий масив.
Станом на PHP> = 7.3 array_key_last()
це найкращий спосіб отримати останній ключ будь-якого масиву. Використовуючи комбінацію end()
, key()
і reset()
просто отримати останній ключ масиву обурливо.
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
порівняйте це з
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
Ви повинні скинути масив, щоб покажчик був на початку, якщо ви використовуєте комбінацію end()
таkey()
Я також хотів би запропонувати альтернативне рішення цієї проблеми.
Якщо припустити, що всі ваші ключі є числовими без пропусків, моїм кращим методом є підрахунок масиву, а потім мінус 1 від цього значення (для врахування факту, що ключі масиву починаються з 0.
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
Це дасть вам:
int (1) кіт
Ви можете скористатися цим:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
Іншим рішенням є створення функції та використання її:
function endKey($array){
end($array);
return key($array);
}
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
Спробуйте це array_reverse()
.
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
Це працює, тому що PHP переміщує вказівник масиву внутрішньо для $ масиву
Найкраще можливе рішення, яке також може бути використане inline:
end($arr) && false ?: key($arr)
Це рішення є лише виразом / твердженням і забезпечує гарне не найкраще можливе виконання.
Використання накресленого прикладу:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
ОНОВЛЕННЯ: У PHP 7.3+: використовувати (звичайно) щойно доданий array_key_last()
метод.