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

Я знаю 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);
}

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

Ответы

Ответ 1

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

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

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

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

array_map('mysql_real_escape_string', $_POST);

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

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

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

Ответ 2

Это потому, что 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);
}

... then

array_walk($_POST, 'myescape');

Ответ 3

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 неверен, но я думаю, вы поймете общую идею.

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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