簡體   English   中英

將函數應用於數組的簡單方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM