Легкий способ применения функции к массиву

Я знаю array_walk() и array_map() . Однако при использовании прежнего, как это было (по старому проекту), он не прошел

 array_walk($_POST, 'mysql_real_escape_string'); 

Предупреждение: mysql_real_escape_string () ожидает, что параметр 2 будет ресурсом, указанная строка.

Поэтому я пошел с этой немного более уродливой версией

 foreach($_POST as $key => $value) { $_POST[$key] = mysql_real_escape_string($value); } 

Так почему же не первый способ работы? Каков наилучший способ сопоставления значений массива с функцией?

Ожидается, что функция обратного вызова, переданная в array_walk , примет два параметра: один для значения и один для ключа:

Как правило, funcname принимает два параметра. Значение параметра массива является первым, а ключ / индекс вторым.

Но mysql_real_escape_string ожидает, что вторым параметром будет ресурс. Вот почему вы получаете эту ошибку.

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

 array_map('mysql_real_escape_string', $_POST); 

Второй параметр будет опущен, поэтому используется последнее открытое соединение.

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

 array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST); 

Это потому, что mysql_real_escape_string присваивается два параметра: обе строки.

http://php.net/manual/en/function.mysql-real-escape-string.php

http://www.phpbuilder.com/manual/en/function.array-map.php :

array_map () возвращает массив, содержащий все элементы arr1 после применения функции обратного вызова к каждому из них. Количество параметров, которые принимает функция обратного вызова, должно соответствовать количеству массивов, переданных массиву array_map ()

вы могли бы сделать

 function myescape($val) { return mysql_real_escape_string($val); } 

… тогда

 array_walk($_POST, 'myescape'); 

mysql_real_escape_string() не будет работать, если вы сначала не подключили mysql. Причина, по которой это так здорово, заключается в том, что она будет выходить из символов таким образом, чтобы соответствовать типу таблицы. Второй [необязательный] аргумент является ссылкой на соединение mysql.

$_POST всегда настроен как key->value . Итак, array_walk вызывает mysql_real_escape_string(value, key) . Обратите внимание, что второй аргумент не является ссылкой.

Вот почему это не работает. Существует несколько решений, упомянутых выше.

http://php.net/manual/en/function.array-walk.php говорит, что array_walk вызовет функцию с двумя аргументами, значением и ключом. Вы должны написать новую функцию для переноса mysql_real_escape_string. Что-то вроде:

 function wrapper($val, $key){ return mysql_real_escape_string($val); } 

А потом:

 array_walk($_POST, 'wrapper'); 

Извините, если мой PHP неправильный, но я думаю, вы поймете общую идею.

Я знаю, что OP попросил вызвать функцию, однако в тех случаях, когда вам действительно не нужно вызывать функцию, вы можете определить анонимную :

 $ids = [1,2,3]; array_walk($ids,function(&$id){$id += 1000;}); 

У меня возникли проблемы с использованием принятого ответа, поскольку это вызвало у меня ошибки по причинам, которые я не мог решить. Поэтому для тех, у кого возникли проблемы с array_walk или array_map, я нашел, что это работает.

 foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);