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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Узнать ключ массива

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Serhio
Отправлено: 20 Января, 2014 - 13:19:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 194
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




Всем привет!

У меня есть массив который хранится в бд
$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-му ключу. Как узнать номер последнего элемента в таких массивах. Вычислять длину здесь понятно нужды нет.

(Отредактировано автором: 20 Января, 2014 - 13:28:45)

 
 Top
eai
Отправлено: 20 Января, 2014 - 13:27:10
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




 
 Top
Fetis
Отправлено: 20 Января, 2014 - 13:28:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 153
Дата рег-ции: Дек. 2012  
Откуда: Киров, Россия


Помог: 0 раз(а)




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

array_pop
 
 Top
Serhio
Отправлено: 20 Января, 2014 - 13:30:26
Post Id



Частый гость


Покинул форум
Сообщений всего: 194
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




Попробую, благодарю!
 
 Top
eai
Отправлено: 20 Января, 2014 - 13:40:53
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




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

array_pop

Сие удалит последний элемент из массива, а он наверное, еще нужен будет
 
 Top
Serhio
Отправлено: 20 Января, 2014 - 14:26:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 194
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




end(array) дает значение последнего элемента
поэтому конструкция key(end(array)) сообщает expect parametr 1 to be array
Есть идеи как все-таки сделать?

(Отредактировано автором: 20 Января, 2014 - 14:27:26)

 
 Top
teddy
Отправлено: 20 Января, 2014 - 14:35:22
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Serhio
а чем echo end($arr); не подходит? Вам же значение последнего элемента нужно получить? или ключ?

если ключ то можно так
 
 Top
Serhio
Отправлено: 20 Января, 2014 - 14:35:45
Post Id



Частый гость


Покинул форум
Сообщений всего: 194
Дата рег-ции: Март 2012  


Помог: 1 раз(а)




Думаю что решил свою задачу!

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

Будьте здоровы!

(Отредактировано автором: 20 Января, 2014 - 14:36:05)

 
 Top
eai
Отправлено: 20 Января, 2014 - 16:12:16
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Serhio пишет:
end(array) дает значение последнего элемента
поэтому конструкция key(end(array)) сообщает expect parametr 1 to be array
Есть идеи как все-таки сделать?




Это быстрее чем array_keys
 
 Top
EuGen Администратор
Отправлено: 20 Января, 2014 - 22:11:59
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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"

- поскольку указатель был перемещён. И найти такое будет очень нелегко.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
eai
Отправлено: 21 Января, 2014 - 09:19:08
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Согласен с теской

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

Однако я сам использовал бы именно этот метод, конечно если бы логика требовала то reset потом обязателен
 
 Top
Pilotka
Отправлено: 29 Января, 2015 - 06:59:59
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Янв. 2015  


Помог: 0 раз(а)




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.  

(Отредактировано автором: 29 Января, 2015 - 07:21:08)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB