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]   

> Без описания
Nizz
Отправлено: 25 Августа, 2017 - 17:19:28
Post Id



Гость


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


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




Заранее извиняюсь за глупый вопрос и прошу всех меня простить. Функция очищает массив по ключу. Данная функция не корректно чистит массив, до 3-ех элементов массива: чистит правильно; более: хаотично и отследить причины не удается. Надеюсь может кто-то увидит ошибку
PHP:
скопировать код в буфер обмена
  1.  
  2. function deleteProducts($id){
  3.    $productsInCart = getProducts();
  4.     if($_POST['dealete']){    
  5.  
  6.   foreach($productsInCart as $key => $id){
  7.  
  8.   $mykey = $key;
  9.   unset($productsInCart[$mykey]);
  10.   $_SESSION['products'] = $productsInCart;
  11.   exit(header('Location: /frail'));
  12.  
  13. }
  14.  
  15.  }
  16. }
  17.  


$id Передаю методом POST.
(Добавление)
Дополню: часто ошибочно чистит и до 3ех элементов в массиве.
 
 Top
rgl
Отправлено: 25 Августа, 2017 - 17:31:23
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Авг. 2017  
Откуда: замкадье


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




А разве внутри foreach можно из массива что-то удалять?
 
 Top
Nizz
Отправлено: 25 Августа, 2017 - 17:40:08
Post Id



Гость


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


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




Да, вы оказались правы. Спасибо вам больше за замечание.rgl с меня + в будущем )
 
 Top
Строитель Модератор
Отправлено: 25 Августа, 2017 - 18:17:24
Post Id



Участник


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


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




rgl пишет:
А разве внутри foreach можно из массива что-то удалять?
Если передавать в цикл значение по ссылке, то можно.
 
 Top
rgl
Отправлено: 25 Августа, 2017 - 18:59:50
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Авг. 2017  
Откуда: замкадье


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




Строитель пишет:
rgl пишет:
А разве внутри foreach можно из массива что-то удалять?
Если передавать в цикл значение по ссылке, то можно.

Разве??
Если передавать ЗНАЧЕНИЕ по ссылке то можно ЗНАЧЕНИН и менять (т.е. ключ остается тот же, значение становится другим), но нельзя делать что-либо, что меняет ключи, т.е. добавлять или удалять элементы. А в примере как раз было удаление.
 
 Top
Строитель Модератор
Отправлено: 25 Августа, 2017 - 19:47:37
Post Id



Участник


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


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




rgl пишет:
Строитель пишет:
rgl пишет:
А разве внутри foreach можно из массива что-то удалять?
Если передавать в цикл значение по ссылке, то можно.

Разве??
Если передавать ЗНАЧЕНИЕ по ссылке то можно ЗНАЧЕНИН и менять (т.е. ключ остается тот же, значение становится другим), но нельзя делать что-либо, что меняет ключи, т.е. добавлять или удалять элементы. А в примере как раз было удаление.
Об изменении структуры массива спорить не буду. Помню только, что с помощью unset() удалялись элементы из массива. Доберусь до ПК, проверю.
 
 Top
rgl
Отправлено: 25 Августа, 2017 - 20:19:35
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Авг. 2017  
Откуда: замкадье


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




Похоже, я был не прав. Вот что пишут
Цитата:
The foreach construct does not operate on the array itself, but rather on a copy of it.
You can insert or delete elements in the body of a foreach loop, safe in the knowledge
that the loop won’t attempt to process the deleted or inserted elements.

Вот так работает, ошибок не заметил.
PHP:
скопировать код в буфер обмена
  1. $a = range( 'a', 'z' );
  2.  
  3. foreach( $a as $k=>$v ) {
  4.   if( $k % 3 )
  5.     unset( $a[$k] );
  6. }
  7.  
  8. print_r( $a );
  9.  
  10. #X-Powered-By: PHP/5.3.13
  11. #Content-type: text/html
  12. #
  13. #Array
  14. #(
  15. #    [0] => a
  16. #    [3] => d
  17. #    [6] => g
  18. #    [9] => j
  19. #    [12] => m
  20. #    [15] => p
  21. #    [18] => s
  22. #    [21] => v
  23. #    [24] => y
  24. #)
  25.  

Для меня это неожиданность. Соори что пытался ввести в заблуждение
 
 Top
Строитель Модератор
Отправлено: 25 Августа, 2017 - 21:24:46
Post Id



Участник


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


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




Nizz, я тут набросал пример, как правильно использовать пользовательские функции. Скопируйте его целиком в отдельный php файл, и запустите в браузере. Код прокомментирован, но если будут вопросы, то задавайте:
Спойлер (Отобразить)
 
 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