PHP: как выполнить htmlspecialchar () на массиве массивов?

Как запустить функцию 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')); 

ОБНОВЛЕНИЕ :

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

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

 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' : []} 

Solutions Collecting From Web of "PHP: как выполнить htmlspecialchar () на массиве массивов?"

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

Вы можете использовать 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 по ссылке, поэтому нет необходимости назначать вывод новой переменной.

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

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

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

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

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

Input: Array ( [0] => test< [1] => Array ( [test>] => <test?> ) [2] => Array ( [0] => test [1] => > [2] => Array ( [0] => bigtest<> ) ) )

Output: Array ( [0] => test&lt; [1] => Array ( [test>] => &lt;test?&gt; ) [2] => Array ( [0] => test [1] => &gt; [2] => Array ( [0] => bigtest&lt;&gt; ) ) )

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

Согласно 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')); 

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

  function cleanhtml($dirtyhtml) { return htmlspecialchars($dirtyhtml, UTF-8); } $cleaned = array_map("cleanhtml", $myArray); 
 function htmlspecialchars_array_modify (&$arr){ array_walk_recursive($arr,function(&$value){ $value=htmlspecialchars($value); }); return $arr; } 

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