【问题标题】:PHP implode array with prefix and commar seperatedPHP 内爆数组,前缀和逗号分隔
【发布时间】:2025-11-26 08:20:05
【问题描述】:

我正在尝试使用数组构建 sql 查询并添加前缀。

例如:

$columns = array('column1', 'column2');

"SELECT ". ltrim(implode(", media_", $columns), ', ') . " FROM media WHERE media_id = '{$id}'";

输出:

从媒体 WHERE media_id = '3' 中选择文件名、媒体图像

我真正想要的:

SELECT media_column1, media_column2 FROM media WHERE media_id = '3'

问题:我该如何: 1. 以“media_”为数组的所有项添加前缀 2. 用逗号分隔多个项目?

【问题讨论】:

    标签: php


    【解决方案1】:

    为什么不把“media_”放在前面呢?:

    $columns = array('column1', 'column2');
    $selectColumns = 'media_' . implode(', media_', $columns);
    
    "SELECT {$selectColumns} FROM media WHERE media_id = '{$id}'";
    

    你也可以使用array_map:

    $columns = array_map(function($column) {
        return 'media_' . $column;
    }, $columns);
    
    "SELECT " . implode(',', $columns) . " FROM media WHERE media_id = '{$id}'";
    

    【讨论】:

    • 因为 implode();接受 2 个参数,后缀(某种)和数组。如果你将一个数组与一个字符串连接起来,PHP 会自动将数组转换为字符串,并且 implode 会尝试对字符串进行内爆。 T_T
    • @ZanderRootman Implode 实际上会返回字符串。任何函数都不会更改其参数属性类型,因为函数被连接到字符串。在这种情况下, implode 第二个参数将始终是一个数组。我已经使用它超过 2 年了。如果您直接将字符串与数组连接,它只会更改属性类型。
    【解决方案2】:

    [已编辑]
    另一种方式

    $fields = array_reduce($columns, function ($result, $element) {
      $result = is_null($result) ? 'media_'.$element : $result.', media_'.$element;
      return $result;
    });
    
    "SELECT {$fields} FROM media WHERE media_id = '{$id}'";
    

    【讨论】:

      【解决方案3】:

      另一种方式:

      <?php
      
      $id = 1;
      $columns = array('column1', 'column2');
      array_walk($columns,'add_prefix','media_');
      
      function add_prefix(&$item, $key, $prefix) {
          $item = $prefix . $item;
      }
      
      
      $sql = "SELECT `" . implode('`,`', $columns) . "` FROM media WHERE media_id = '{$id}'";
      echo "SQL:" . $sql . "\r\n";
      

      选择最适合您的。

      【讨论】: