【问题标题】:Replace certain characters in a string from array values从数组值替换字符串中的某些字符
【发布时间】:2019-05-03 14:28:49
【问题描述】:

我有一个数组:

$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'

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

我尝试做这样的事情,但它并没有取代任何东西:

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

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

【问题讨论】:

  • $params 是什么?
  • @B001ᛦ 错字,已修复。
  • 实际的问题应该是“你为什么需要那个”?为什么不用mysql日志?
  • erm,我对 php 了解不多,但字符串不是不可变的。例如,您需要分配参考
  • @B001ᛦ 我不是在寻找替代方案或“你应该这样做或那样做”,我试图理解为什么这段代码不能按原样工作。

标签: php eloquent


【解决方案1】:

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

【讨论】:

  • 不过,它不适用于多个变量。 str_replace 替换针的所有实例。
  • @ChrisWhite 感谢您指出这一点。我已经更正了代码。
  • @Equgonyka 记下 Chris 的评论;我已经编辑了代码来解决这个问题。
【解决方案2】:

我发现了如何做到这一点,通过使用str_replace_first 并将值分配给一个变量。

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

str_replace_first

function str_replace_first($search_for, $replace_with, $in) {
  $pos = strpos($in, $search_for);
  if($pos === false) {
    return $in;
  } else {
    return substr($in, 0, $pos) . $replace_with . substr($in, $pos + strlen($search_for), strlen($in));
  }
}

【讨论】:

  • 你在哪里找到这个功能的?这不是标准的 PHP
  • @Nick 是的,我添加了我创建的函数,你能告诉我你的想法吗?尽管如此,我还是赞成你的回答。
  • 这看起来是一种非常有效的方法。我唯一想说的是,第二次调用substr 不需要长度参数。此外,您可能想查看 substr_replace 作为整行的替代品,例如substr_replace($in, $replace_with, $pos, strlen($search_for));
猜你喜欢
  • 2018-08-23
  • 2012-02-18
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2021-07-16
  • 2012-03-30
  • 2011-02-21
相关资源
最近更新 更多