Функции обратного вызова массива PHP для очистки вывода - PullRequest
1 голос
/ 09 ноября 2009

У меня есть массив выходных данных из базы данных. Мне интересно, какой самый чистый способ фильтрации значений

пример массива

Array
(
    [0] => Array
        (
            [title] => title 1
            [cat_title] => Drawings
            [sec_title] => Portfolio
        )

    [1] => Array
        (
            [title] => title 2
            [cat_title] => Paintings
            [sec_title] => Portfolio
        )

    [2] => Array
        (
            [title] => title 3
            [cat_title] => Drawings
            [sec_title] => Portfolio
        )
)

В качестве примера, каков будет самый чистый способ сделать все cat_title прописными и все sec_title в htmlspecialchars?

Я подумал, что если отсортировал массив неправильно, я мог бы использовать функцию карты массива. как это

неправильный массив

Array
(
    [title] => Array
        (
            [0] => title 1
            [1] => title 2
            [2] => title 3
        )

    [cat_title] => Array
        (
            [0] => Drawings
            [1] => Paintings
            [2] => Drawings
        )

)

Тогда я мог бы сделать что-нибудь полезное, как:

array_map('strtoupper', $array['cat_title']);

и сделать все заглавные буквы cat_titles за один раз. Нечто подобное наверняка победило бы это, что сейчас составляет .

$count = count($array);
for($i=0; $i < $count; $i++) { 
    //filter list output
    if (isset($array[$i]['cat_title'])) {
        $array[$i]['cat_title'] = strtoupper($array[$i]['cat_title']);
    }
}

Вы, ребята, знаете, в любом случае, я мог бы вызывать функции обратного вызова в пронумерованном массиве немного более элегантно, чем выше? Надеюсь, без сортировки массива неправильно? что-то вроде array_map или array_walk?

Ответы [ 5 ]

2 голосов
/ 09 ноября 2009

Действительно элегантный способ сделать это - НЕ использовать ассоциативные массивы вообще: создать массив объектов. Превратите ваш элемент в класс, который имеет конструктор, а title, cat_title и sec_title в качестве полей. Затем сделайте их приватными и используйте сеттеры (или используйте конструктор), где вы будете проверять данные и выполнять любую необходимую вам проверку или преобразование.

1 голос
/ 09 ноября 2009

Вы можете сделать это с помощью array_walk, это будет что-то вроде:

function cleanData( &$item, $key )
{
  $item['cat_title'] = strtoupper( $item['cat_title'] );
  $item['sec_title'] = htmlspecialchars( $item['sec_title'] );
}

array_walk( $arr, 'cleanData' );

Однако такие функции, как htmlspecialchars, действительно предназначены только для самого последнего момента, когда вы фактически отправляете контент в браузер. До этого вы хотите работать с необработанным текстом и просто иметь <?=htmlspecialchars($var)?> в файле шаблона / представления. В противном случае вы можете столкнуться с проблемами кодирования, если, например, отправите эти закодированные данные в базу данных, затем получите их и снова запустите htmlspecialchars.


ОБНОВЛЕНИЕ : Вот код, который я использовал для проверки этого; Он отлично работает для меня. Я нахожусь на PHP 5.2, но нет никакой разницы в функции от версии 4 +.

<code>$arr = array(
    array( 'title' => 'title 1', 'cat_title' => 'Drawings', 'sec_title' => 'Portfolio' ),
    array( 'title' => 'title 2', 'cat_title' => 'Paintings', 'sec_title' => 'Portfolio' ),
    array( 'title' => 'title 3', 'cat_title' => 'Drawings2', 'sec_title' => 'Portfolio' )
);


array_walk( $arr, 'cleanData' );
echo '<pre>', print_r($arr, true), '
';

Выходы:

Array
(
    [0] => Array
        (
            [title] => title 1
            [cat_title] => DRAWINGS
            [sec_title] => Portfolio
        )

    [1] => Array
        (
            [title] => title 2
            [cat_title] => PAINTINGS
            [sec_title] => Portfolio
        )

    [2] => Array
        (
            [title] => title 3
            [cat_title] => DRAWINGS2
            [sec_title] => Portfolio
        )

)
0 голосов
/ 09 ноября 2009

Я бы порекомендовал цикл foreach вместо этого, поскольку он немного быстрее, поскольку вы экономите накладные расходы на ненужные вызовы функций.

<?php
foreach ($array as &$item) {
  $item['cat_title'] = strtoupper($item['cat_title']);
  $item['sec_title'] = htmlentities($item['sec_title']);
}
?>
0 голосов
/ 09 ноября 2009

Полагаю, вы могли бы просто использовать array_keys, что, по крайней мере, дало бы вам доступ ко всему, что вы хотите, на более базовом уровне:

foreach( $holder as $subarr )
{
    $keys = array_keys( $subarr );
    foreach( $keys as $key )
    {
        switch( $key ):
        {
            case 'cat_title':
                $subarr[ $key ] = strtoupper( $subarr[ $key ] );
                break;
            default:                    
                $subarr[ $key ] = htmlspecialchars( $subarr[ $key ] );
        }
    }
}

Конечно, это решение гораздо более многословно, чем вам нужно, но оно будет работать.

0 голосов
/ 09 ноября 2009

Мое решение использует array_map и анонимные функции :

<?php
$data = array_map(
    function($element) {
        $element['cat_title'] = strtoupper($element['cat_title']);
        $element['sec_title'] = htmlentities($element['sec_title']);
        return $element;
    },
    $data);
?>

Если вы используете PHP <5.3, вам нужно поместить эту функцию в другое место, поскольку эти анонимные функции являются функцией 5.3. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...