Рекурсивная обработка массива

Приятно иметь "умные" функции, в которые всё равно что передавать - с помощью какой-то магии она сама поймёт что ей передали и что нужно с этим сделать. Например, когда нужно сделать htmlspecialchars, лучше иметь одну функцию и для одной строки, и для массива. Вот как я это решал такие задачи раньше:

PHP:
  1. function h($text) {
  2.     if (is_array($text)) {
  3.         foreach ($text as &$item) {
  4.             $item = h($item);
  5.         }
  6.         return $text;
  7.     }
  8.     return htmlspecialchars($text);
  9. }

А для совместимости с PHP 4 пришлось бы вообще писать:

PHP:
  1. function h($text) {
  2.     if (is_array($text)) {
  3.         $count = count($text);
  4.         for ($i=0; $i<$count; $i++) {
  5.             $text[$i] = h($text[$i]);
  6.         }
  7.         return $text;
  8.     }
  9.     return htmlspecialchars($text);
  10. }

потому что PHP 4 не может изменять переменные внутри foreach.

А рассказываю я это, чтобы показать, что очень полезно читать чужой код, особенно, если его делали более профессиональные программисты. Сегодня наткнулся на такой кусок в cake/basics.php

PHP:
  1. function h($text) {
  2.     if (is_array($text)) {
  3.         return array_map('h', $text);
  4.     }
  5.     return htmlspecialchars($text);
  6. }

Красота!


Понравилось?

  1. Подпишись через RSS
  2. Расскажи о http://php.southpark.com.ua друзьям.
    Все способы хороши: ICQ, E-mail, свой блог, комментарий в чужом блоге или сообщение на форуме
  3. Добавь статью на news2.ru, Хабрахабр или в закладки

Огромное спасибо!

И не стесняйтесь комментировать - у меня стоит плагин, который убирает rel="nofollow" у людей, которые написали больше 5 комментариев.

RSS feed | Trackback URI

4 комментария »

Comment by Влад
2007-11-23 20:52:53

Да, на текстах кейка можно учиться и учиться...

 
Comment by larin Subscribed to comments via email
2007-11-29 16:46:31

Действительно, красиво! А главное просто!
В таких случаях я говорю: "Браво!" :)

 
2007-12-02 21:05:06

Гм, так функция-то вроде в доке пхп описана, давно пользую наряду с array_filter().
А исходники кейка -- вещь клевая. Я, похоже, их изучаю больше, чем ман :-)

 
2007-12-03 09:13:22

Функция, конечно, описана - http://www.php.net/manual/en/function.array-map.php
Мало того, я о ней знал. Но почему то так не использовал, пока не заметил в Cake.

 
Имя (required)
E-mail (required - never shown publicly)
URL
Текст комментария
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> in your comment.