从数组值替换字符串中的某些字符

时间:2019-05-03 14:28:50

标签: php eloquent

我有一个数组:

$arr = [5, "David"];

我有一个查询:

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

我想创建一个记录器查询,该查询使用这2个记录并手动返回查询。

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

我正在使用雄辩的胶囊管理员。

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

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

为什么此代码不起作用?

2 个答案:

答案 0 :(得分:2)

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

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'

Demo on 3v4l.org

答案 1 :(得分:1)

我通过使用System.Collections.Generic并将值辅助为变量来了解如何做到这一点。

using System;
using System.Collections.Generic;

namespace TextProcessor
{
    class App
    {
        static void Main(string[] args)
        {
            HashSet<string> set = new HashSet<string>();
            SortedSet<string> sortedset = new SortedSet<string>();
            Console.ReadKey();
        }
    }
}

str_replace_first

        foreach($params as $a) {
            $query = is_numeric($a) ? str_replace_first("?",$a,$query,1) : str_replace_first("?","'".$a."'",$query);
        }
        return $query;