Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Узнать ключ массива
Форумы портала PHP.SU » » Вопросы новичков » Узнать ключ массива

Страниц (1): [1]
 

1. Serhio - 20 Января, 2014 - 13:19:17 - перейти к сообщению
Всем привет!

У меня есть массив который хранится в бд
$array = serialize($array);

Потом у меня в коде я достаю этот массив

$arr=unserialize($row['blalbla']);
foreach ($arr as $arraynumer=>$key):?>

blalbla

<?php endforeach; ...

Вот вопрос как обратится к последнему элементу этого массива?

У меня в силу редактирования массива идут ключи с пробелами например 0,3,4,6,7..

Мне нужно знать номер последнего элемента, как его узнать?


Или могу иначе задать вопрос! Когда из массива удаляется элемент unset(array[$x]) то ключи не переименовываются. Было 5 элементов столо 4 и к последнему элементу обращение идет как по 5-му ключу. Как узнать номер последнего элемента в таких массивах. Вычислять длину здесь понятно нужды нет.
3. Fetis - 20 Января, 2014 - 13:28:47 - перейти к сообщению
Serhio пишет:
Вот вопрос как обратится к последнему элементу этого массива?

array_pop
4. Serhio - 20 Января, 2014 - 13:30:26 - перейти к сообщению
Попробую, благодарю!
5. eai - 20 Января, 2014 - 13:40:53 - перейти к сообщению
Fetis пишет:
Serhio пишет:
Вот вопрос как обратится к последнему элементу этого массива?

array_pop

Сие удалит последний элемент из массива, а он наверное, еще нужен будет
6. Serhio - 20 Января, 2014 - 14:26:57 - перейти к сообщению
end(array) дает значение последнего элемента
поэтому конструкция key(end(array)) сообщает expect parametr 1 to be array
Есть идеи как все-таки сделать?
7. teddy - 20 Января, 2014 - 14:35:22 - перейти к сообщению
Serhio
а чем echo end($arr); не подходит? Вам же значение последнего элемента нужно получить? или ключ?

если ключ то можно так
8. Serhio - 20 Января, 2014 - 14:35:45 - перейти к сообщению
Думаю что решил свою задачу!

$keys = array_keys($array);
$last = end($keys);

Будьте здоровы!
9. eai - 20 Января, 2014 - 16:12:16 - перейти к сообщению
Serhio пишет:
end(array) дает значение последнего элемента
поэтому конструкция key(end(array)) сообщает expect parametr 1 to be array
Есть идеи как все-таки сделать?




Это быстрее чем array_keys
10. EuGen - 20 Января, 2014 - 22:11:59 - перейти к сообщению
eai пишет:
key(end($array));

Так некорректно делать, поскольку end лишь переводит внутренний указатель, она не возвращает массив. Но, если честно - использовать end в общем случае я бы не рекомендовал. Это, действительно, быстрый способ, однако если забыть о таком действии, то можно получить очень трудно уловимую ошибку, ведь при операциях с массивом внутренний указатель будет передвинут. Здесь - либо использовать reset, либо использовать вообще другой способ. При этом reset тоже плох в общем случае - ведь в контексте операции нахождения ключа может быть так, что происходит итерация какого-либо внешнего цикла, к примеру, так что нарушать позицию указателя будет неверным решением.

Безопасным (но не самым быстрым) способом будет уже упомянутая array_keys. Она плоха лишь тем, что создаёт новый массив для такой простой операции. В случае, если массив большой, это может вызвать проблемы.

Небольшая иллюстрация того, почему бездумно использовать end - плохо:
PHP:
скопировать код в буфер обмена
  1. $data = ['foo'=>'1', 'bar'=>'2', 'baz'=>'3'];
  2. while(list($key, $value) = each($data))
  3. {
  4.     echo(sprintf('Current key is [%s] and value [%s]'.PHP_EOL, $key, $value));
  5.     if($value==='1')
  6.     {
  7.         //just want to use last key for some reason here:
  8.         end($data);
  9.         $result = key($data);
  10.     }
  11. }
  12. var_dump($result);

- результатом этого будет неожиданное:
CODE (php):
скопировать код в буфер обмена
  1. Current key is [foo] and value [1]
  2. Current key is [baz] and value [3]
  3. string(3) "baz"

- поскольку указатель был перемещён. И найти такое будет очень нелегко.
11. eai - 21 Января, 2014 - 09:19:08 - перейти к сообщению
Согласен с теской

Неосторожное использование end это опасно

Однако я сам использовал бы именно этот метод, конечно если бы логика требовала то reset потом обязателен
12. Pilotka - 29 Января, 2015 - 06:59:59 - перейти к сообщению
Serhio пишет:
...Когда из массива удаляется элемент unset(array[$x]) то ключи не переименовываются...


Я конечно понимаю что давать советы это не красиво.
А обязательно нужно использовать unset(array[$x]) ?
Например можно сделать так
array_splice( $array, $x, 1 ) ;// удаляем элемент и сжимаем $array
далее используем
array_pop ()
или так
PHP:
скопировать код в буфер обмена
  1.  
  2. $x = 4 ;
  3. $array = array( 11, 22, 33, 44, 55, 66, 77 ) ;
  4. array_splice( $array, $x, 1 ) ; // удаляем элемент и сжимаем $array
  5. $key =  count($array)-1 ;       // последний ключ $array = 5
  6.  
  7. print $array[count($array)-1] ; // последний элемент $array = 77
  8. print_r ( $array ) ;                  
  9.  
  10. /*
  11. (
  12.     [0] => 11
  13.     [1] => 22
  14.     [2] => 33
  15.     [3] => 44
  16.     [4] => 66
  17.     [5] => 77
  18. )
  19.  
  20. */
  21.  

 

Powered by ExBB FM 1.0 RC1