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 :: Версия для печати :: array_valk_recursive и php 5.4.*
Форумы портала PHP.SU » » Если скрипт не работает » array_valk_recursive и php 5.4.*

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

1. Haron - 20 Октября, 2012 - 22:54:55 - перейти к сообщению
Имеется в php такая замечательная функция:



Все могут ознакомиться с тем, для чего она нужна.

Но вот незадача, в php 5.4.* - вываливается ошибка, что:

Цитата:
Fatal error: Call-time pass-by-reference has been removed...


То бишь мы не сможем изменить ключи и значения в переданном массиве, по ссылке. Хотя в официальной документации - всё пучком и УМВР.

Вопрос, как-же быть в php 5.4.* если надо изменить ключи и значения передаваемого массива?
2. dubasua - 20 Октября, 2012 - 22:59:22 - перейти к сообщению
А чем так не удобен старый добрый foreach()?
3. Haron - 20 Октября, 2012 - 23:02:34 - перейти к сообщению
А ты перебери им многомерный массив с неизвестной изначально структурой?

Вообще можно конечно, но это будет "рекурсивный костыль", со всеми вытекающими.
4. dubasua - 20 Октября, 2012 - 23:05:53 - перейти к сообщению
Haron пишет:
А ты перебери им многомерный массив с неизвестной изначально структурой?

Вообще можно конечно, но это будет "рекурсивный костыль", со всеми вытекающими.

Дык напиши рекурсию! Тем более что foreach тоже работает с сылками, массив можно и не копировать
5. Haron - 20 Октября, 2012 - 23:07:58 - перейти к сообщению
Е**л я рекурсии... Но всё-таки хотелось бы разъяснений по теме, без применения костылей.
6. dubasua - 20 Октября, 2012 - 23:12:34 - перейти к сообщению
Я про то что array_walk_recursive() тоже рекурсия, (можно догадатся даже по названию) только написана она на C++, а ты напиши свою пользовательскую.
7. Haron - 20 Октября, 2012 - 23:33:37 - перейти к сообщению
Вот собственно, что родил:

PHP:
скопировать код в буфер обмена
  1. function array_walk_recursive_worked($input, $function)
  2.         {
  3.                 foreach ($input as &$v)
  4.                 {
  5.                         if (is_array($v))
  6.                         {
  7.                                 $v = array_walk_recursive_worked($v);
  8.                         }
  9.                         else
  10.                         {
  11.                                 $v = $function($v);
  12.                         }
  13.                         unset($v);
  14.                 }
  15.                 return $input;
  16.         }


Печально, что приходится писать костыли, из-за фимоза php-девелоперов. Функция работает, правда только со значениями (не с ключами!), может кому и пригодится.

Надо бы подумать, как до работы с ключами доработать.
8. dubasua - 20 Октября, 2012 - 23:37:34 - перейти к сообщению
А что мешает добавить ключ???
PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($array as &$k => &$v){
  3.  
  4. }
  5.  
9. Haron - 20 Октября, 2012 - 23:38:55 - перейти к сообщению
Цитата:
А что мешает добавить ключ???


Это:

Цитата:
Fatal error: Key element cannot be a reference in ...
10. dubasua - 20 Октября, 2012 - 23:40:59 - перейти к сообщению
Грустно, ну тогда возвращять новый массив, с новыми значениями и ключами

 

Powered by ExBB FM 1.0 RC1