PHP: как выполнить htmlspecialchar () для массива массивов? - PullRequest
14 голосов
/ 05 января 2010

Как запустить функцию PHP htmlspecialchars() для массива объектов массива?

У меня есть следующий код:

$result_set = Array
(
    [0] => Array
        (
            [home_id] => 1
            [address] => 4225 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 76798
        )

    [1] => Array
        (
            [home_id] => 8
            [address] => 4229 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 75093
        )
);

// this doesn't work since $result_set is an array of arrays and htmlspecialchars is expecting a string
htmlspecialchars($result_set, ENT_QUOTES, 'UTF-8')); 

UPDATE

Обратите внимание, что, хотя ниже приведено довольно много ответов, ни один из них не подходит для массива массивов. Ответы ниже работают только для простых массивов.

Я пробовал следующее, но это не работает:

array_walk_recursive($result_set, "htmlspecialchars", array(ENT_QUOTES,'UTF-8'))

Я получаю следующую ошибку: htmlspecialchars() expects parameter 2 to be long, string given


ОБНОВЛЕНИЕ 2

Когда я пытаюсь:

function cleanOutput(&$value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
print_r($result_set);
print('-------');
print_r(array_walk_recursive($result_set, "cleanOutput"));

Я получаю следующий нежелательный вывод:

Array
(
    [0] => Array
        (
            [home_id] => 1
            [address] => 4225 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 76798
        )
    [1] => Array
        (
            [home_id] => 8
            [address] => 4229 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 75093
        )
)
-------1

ОБНОВЛЕНИЕ 3

Когда я пытаюсь:

function cleanOutput(&$value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
$result_set = Array
    (
        [0] => Array
            (
                [home_id] => 1
                [address] => 4225 Nasmyth Dr
                [city] => Plano
                [state] => TX
                [zip] => 76798
            )

        [1] => Array
            (
                [home_id] => 8
                [address] => 4229 Nasmyth Dr
                [city] => Plano
                [state] => TX
                [zip] => 75093
            )
    );

$cleanedOutput = array();
foreach ($result_set as $rs) {
    $cleaned[] = array_map("cleanOutput", $rs);
}
print_r($cleanedOutput);

Я получаю следующие нежелательные результаты:

{'homes' : []}

Ответы [ 8 ]

23 голосов
/ 05 января 2010

Вы можете использовать array_map() для запуска этого метода для каждой записи.

$cleaned = array_map("htmlspecialchars", $myArray);

Если вам нужно передать аргументы htmlspecialchars(), вы можете заменить его собственной пользовательской функцией:

function myFunc($a) {
  return htmlspecialchars($a, ENT_QUOES);
}

$cleaned = array_map("myFunc", $myArray);

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

$cleaned = array();
foreach ($result_set as $rs) {
  foreach ($rs as $r) {
    $cleaned[] = array_map("htmlspecialchars", $r);
  }
}

Или вы можете использовать array_walk_recursive():

array_walk_recursive($myArray, "htmlspecialchars");

Обратите внимание, что этот метод изменяет объект $ myArray по ссылке, поэтому нет необходимости присваивать вывод новой переменной.

15 голосов
/ 05 января 2010
function filter(&$value) {
  $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
array_walk_recursive($result_set, "filter");
print_r($result_set);
4 голосов
/ 05 января 2010

Вы можете использовать array_map, как предложил Джонатон Сэмпсон, другой альтернативой является array_walk

Разница в том, что array_map возвращает копию массива с функцией, примененной к каждому элементу, тогда как array_walk работает непосредственно с указанным вами массивом.

2 голосов
/ 01 декабря 2013

Сделан способ заставить его работать для многомерных массивов:

function secure($val) {
    return (is_array($val))?array_map('secure',$val):htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
}

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

Ввод: Array ( [0] => test< [1] => Array ( [test>] => <test?> ) [2] => Array ( [0] => test [1] => > [2] => Array ( [0] => bigtest<> ) ) )

Выход: Array ( [0] => test&lt; [1] => Array ( [test>] => &lt;test?&gt; ) [2] => Array ( [0] => test [1] => &gt; [2] => Array ( [0] => bigtest&lt;&gt; ) ) )

1 голос
/ 05 января 2010

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

По данным php.net :

array array_map ( callback $callback , array $arr1 [, array $... ] )

Так что это означает, что если вы хотите передать несколько аргументов, вы должны просто передать:

$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES, 'UTF-8'));

но по какой-то причине это не работает для меня.

Но, похоже, это так, не спрашивайте меня, почему.

$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES), array('UTF-8'));
0 голосов
/ 21 мая 2018

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

htmlspecialchars_recursive ()

<?php

function htmlspecialchars_recursive ($input, $flags = ENT_COMPAT | ENT_HTML401, $encoding = 'UTF-8', $double_encode = false) {
    static $flags, $encoding, $double_encode;
    if (is_array($input)) {
        return array_map('htmlspecialchars_recursive', $input);
    }
    else if (is_scalar($input)) {
        return htmlspecialchars($input, $flags, $encoding, $double_encode);
    }
    else {
        return $input;
    }
}

$test = array(
    0 => array(
        'test-1' => 'testing <p>html tag</p> will be fixed',
        'test-2' => '&reg; valid and will be left intact',
        'test-3' =>  '© 2080 kept intact'
    ),
    1 => array(
        'test-4' => array(
            'test-5' => 'deeper fix on <p>html tag</p> test',
            'test-6' => '&reg; will be left intact',
            'test-7' =>  '© 2080 kept intact'
        )
    )
);

print_r(htmlspecialchars_recursive($test));

?>

выход

Array
(
    [0] => Array
        (
            [test-1] => testing &lt;p&gt;html tag&lt;/p&gt; will be fixed
            [test-2] => &reg; valid and will be left intact
            [test-3] => © 2080 kept intact
        )

    [1] => Array
        (
            [test-4] => Array
                (
                    [test-5] => deeper fix on &lt;p&gt;html tag&lt;/p&gt; test
                    [test-6] => &reg; will be left intact
                    [test-7] => © 2080 kept intact
                )

        )

)
0 голосов
/ 27 июня 2016
function htmlspecialchars_array_modify (&$arr){
        array_walk_recursive($arr,function(&$value){
            $value=htmlspecialchars($value);
        });
        return $arr;
    }

// это изменит источник

0 голосов
/ 05 января 2010

Если вы хотите использовать array_map и передать аргументы функции, вы можете создать свою собственную функцию и использовать ее в качестве обратного вызова:

 function cleanhtml($dirtyhtml) {
       return htmlspecialchars($dirtyhtml, UTF-8);
  }

  $cleaned = array_map("cleanhtml", $myArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...