[英]Easy way to apply a function to an array
我知道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('mysql_real_escape_string', $_POST);
第二個參數將被省略,因此使用最后打開的連接。
如果需要傳遞第二個參數,則需要將函數調用包裝在另一個函數中,例如匿名函數:
array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST);
我知道 OP 要求調用一個函數,但是在您實際上不需要調用函數的情況下,您可以定義一個匿名函數:
$ids = [1,2,3];
array_walk($ids,function(&$id){$id += 1000;});
這是因為 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');
http://php.net/manual/en/function.array-walk.php說 array_walk 將使用 2 個參數調用函數,值和鍵。 您應該編寫一個新函數來包裝 mysql_real_escape_string。 就像是:
function wrapper($val, $key){
return mysql_real_escape_string($val);
}
進而:
array_walk($_POST, 'wrapper');
對不起,如果我的 PHP 不正確,但我認為您會理解總體思路。
除非您先建立了 mysql 連接,否則mysql_real_escape_string()
將無法工作。 它如此酷的原因是它會以適合表格類型的方式轉義字符。 第二個 [可選] 參數是對 mysql 連接的引用。
$_POST
始終設置為key->value
。 所以,你array_walk
調用mysql_real_escape_string(value, key)
。 注意第二個參數不是引用。
這就是為什么它不起作用。 上面已經提到了幾種解決方案。
PHP 7.4 風格:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
array_map(fn($string) => mysqli_real_escape_string($string, $link), $_POST);
我在使用接受的答案時遇到了麻煩,因為它導致我由於無法解決的原因而出錯。 因此,對於任何在 array_walk 或 array_map 上遇到問題的人,我發現它可以工作。
foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.