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. Nizz - 25 Августа, 2017 - 17:19:28 - перейти к сообщению
Заранее извиняюсь за глупый вопрос и прошу всех меня простить. Функция очищает массив по ключу. Данная функция не корректно чистит массив, до 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ех элементов в массиве.
2. rgl - 25 Августа, 2017 - 17:31:23 - перейти к сообщению
А разве внутри foreach можно из массива что-то удалять?
3. Nizz - 25 Августа, 2017 - 17:40:08 - перейти к сообщению
Да, вы оказались правы. Спасибо вам больше за замечание.rgl с меня + в будущем )
4. Строитель - 25 Августа, 2017 - 18:17:24 - перейти к сообщению
rgl пишет:
А разве внутри foreach можно из массива что-то удалять?
Если передавать в цикл значение по ссылке, то можно.
5. rgl - 25 Августа, 2017 - 18:59:50 - перейти к сообщению
Строитель пишет:
rgl пишет:
А разве внутри foreach можно из массива что-то удалять?
Если передавать в цикл значение по ссылке, то можно.

Разве??
Если передавать ЗНАЧЕНИЕ по ссылке то можно ЗНАЧЕНИН и менять (т.е. ключ остается тот же, значение становится другим), но нельзя делать что-либо, что меняет ключи, т.е. добавлять или удалять элементы. А в примере как раз было удаление.
6. Строитель - 25 Августа, 2017 - 19:47:37 - перейти к сообщению
rgl пишет:
Строитель пишет:
rgl пишет:
А разве внутри foreach можно из массива что-то удалять?
Если передавать в цикл значение по ссылке, то можно.

Разве??
Если передавать ЗНАЧЕНИЕ по ссылке то можно ЗНАЧЕНИН и менять (т.е. ключ остается тот же, значение становится другим), но нельзя делать что-либо, что меняет ключи, т.е. добавлять или удалять элементы. А в примере как раз было удаление.
Об изменении структуры массива спорить не буду. Помню только, что с помощью unset() удалялись элементы из массива. Доберусь до ПК, проверю.
7. rgl - 25 Августа, 2017 - 20:19:35 - перейти к сообщению
Похоже, я был не прав. Вот что пишут
Цитата:
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.  

Для меня это неожиданность. Соори что пытался ввести в заблуждение
8. Строитель - 25 Августа, 2017 - 21:24:46 - перейти к сообщению
Nizz, я тут набросал пример, как правильно использовать пользовательские функции. Скопируйте его целиком в отдельный php файл, и запустите в браузере. Код прокомментирован, но если будут вопросы, то задавайте:
Спойлер (Отобразить)

 

Powered by ExBB FM 1.0 RC1