首页 > 解决方案 > 从数组值替换字符串中的某些字符

问题描述

我有一个数组:

$arr = [5, "David"];

我有一个查询:

$query = "SELECT * FROM users WHERE user_id = ? AND user_name = ?";

我想创建一个记录器查询,它采用这两个并手动返回查询。

logger($query, $arr); // returns : SELECT * FROM users WHERE user_id = 5 AND user_name = 'David'

我正在使用 eloquent 的胶囊管理器。

我尝试做这样的事情,但它不能代替任何东西:

function logger($query, $arr) {
    foreach($arr as $a) {
        is_numeric($a) ? str_replace("?",$a,$query) : str_replace("?","'".$a."'",$query);
    }
    return $query;
}

为什么这段代码不起作用?

标签: phpeloquent

解决方案


str_replace不修改其参数,而是返回修改后的值。所以你需要将它的输出分配给一个变量。然而问题是它str_replace会同时替换所有出现的模式。相反,您可以使用preg_replace,它有一个limit参数,可以用来告诉它每次调用只替换一次出现的模式。我使用了一种模式preg_replace,以确保仅?替换查询中的 a ,以防其他地方(例如列别名)中存在问号。将您的功能更改为:

function logger($query, $arr) {
    foreach($arr as $a) {
        $query = is_numeric($a) ? 
            preg_replace("/(?<=\s)\?(?=\s|$)/", $a, $query, 1) : 
            preg_replace("/(?<=\s)\?(?=\s|$)/", "'$a'", $query, 1);
    }
    return $query;
}

输出:

SELECT * FROM users WHERE user_id = 5 AND user_name = 'David'

3v4l.org 上的演示


推荐阅读