【问题标题】:How to efficiently create an array with a define() list?如何有效地创建一个带有 define() 列表的数组?
【发布时间】:2016-06-10 15:39:51
【问题描述】:

我有一个需要在 SQL 查询中检查的项目列表,并定义了一个要在查询中使用的常量:

define(ORG_CHART_VARS, "'first_name', 'last_name', 'nickname', 'title', 'oc_work_status', 'oc_branch', 'oc_dept_id', 'oc_dept_card', 'oc_dept_card_group', 'oc_dept_card_sub', 'oc_emp_rank', 'about_page_URL', 'description'");

我想用列表创建一个数组并尝试$allMetaKeys = array(str_replace("'", "", explode("', '", ORG_CHART_VARS))); 它适用于除第一个和最后一个项目之外的所有项目

我知道我可以使用正则表达式来解析它,但我猜有一种我没有看到的完全更有效的方法。

字符串和数组都需要包含相同的项目,并且它们将来可能会发生变化(这就是为什么我想要一个列表而不是 2 个)但我不在乎是数组先出现还是字符串先出现,它们只需要匹配(并在循环和 SQL 查询中工作)

【问题讨论】:

  • 当你定义你的 ORG_CHART_VARS 时,你应该把它放在引号里。 define('ORG_CHART_VARS', ...); 否则会发出通知。

标签: php sql arrays loops foreach


【解决方案1】:

首先,我会质疑将值的字符串列表存储在常量中的决定。使用数据结构(如数组)将是理想的。

话虽如此,您当前的代码似乎确实对我有用,并且包括第一项和最后一项。但是它确实有一个额外的数组级别:https://3v4l.org/k9qQO

假设你真的需要使用一个常量,你有几个选择:

PHP 5.6+

如果您使用的是 PHP 5.6,您实际上可以将数组存储在常量中!

define('ORG_CHART_VARS', ['first_name', 'last_name', 'nickname', 'title', 'oc_work_status', 'oc_branch', 'oc_dept_id', 'oc_dept_card', 'oc_dept_card_group', 'oc_dept_card_sub', 'oc_emp_rank', 'about_page_URL', 'description']);

工作示例:https://3v4l.org/qQojT

在您的 SQL 查询中使用这个数组将非常容易,只需稍作修改。构建查询时只需使用implode

$vars = "'" . implode("', '", ORG_CHART_VARS) . "'";
$query = "SELECT foo FROM table WHERE bar IN ($vars)";

例如:https://3v4l.org/GtFmv

PHP

否则,如果您坚持使用现有常量,则可以稍微改进解析代码。

如果你翻转 str_replaceexplode,你会得到一个包含所有项目的单维数组:

$allMetaKeys = explode(", ", str_replace("'","", ORG_CHART_VARS));

工作示例:https://3v4l.org/2CvFQ

【讨论】:

  • 该死!你是对的,我遇到问题的不是解析,而是添加了额外的数组。我确实喜欢交换str_replaceexplode,但这是最有效的方法吗?至于“字符串和数组”问题,是针对 SQL 查询:` $query = "SELECT $foo FROM "TABLE." WHERE $bar IN (".VARS.")"; `,但我不会反对使用循环来构建该字符串。
  • @BillyNair 当然,我明白了。但是如果你存储一个数组,你就有更多的灵活性。您的查询只需要implode 该数组,我会说这是更可取的。只是我的 0.02 美元。
  • @BillyNair 将字符串拆分为数组并从每条数据周围删除单引号的最有效方法?是的,我相信是的。 =) 除非您首先更改存储列表的方式,否则我相信这是您的最佳选择。
  • HHHMMMmmm...那个内爆选项,我会调查的。这可能是缺少的链接
  • @BillyNair 刚刚用示例查询更新了我的答案
【解决方案2】:

直接爆炸会起作用!

注意我在引号中正确定义了ORG_CHART_VARS!我假设您在关闭display_errors 的情况下进行开发,所以我建议您在调试它们时将这两行代码添加到所有脚本的顶部

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1);

define( 'ORG_CHART_VARS', "'first_name', 'last_name', 'nickname', 'title', 'oc_work_status', 'oc_branch', 'oc_dept_id', 'oc_dept_card', 'oc_dept_card_group', 'oc_dept_card_sub', 'oc_emp_rank', 'about_page_URL', 'description'");

$ar = explode(',', ORG_CHART_VARS);

print_r($ar);

结果:

Array
(
    [0] => 'first_name'
    [1] =>  'last_name'
    [2] =>  'nickname'
    [3] =>  'title'
    [4] =>  'oc_work_status'
    [5] =>  'oc_branch'
    [6] =>  'oc_dept_id'
    [7] =>  'oc_dept_card'
    [8] =>  'oc_dept_card_group'
    [9] =>  'oc_dept_card_sub'
    [10] =>  'oc_emp_rank'
    [11] =>  'about_page_URL'
    [12] =>  'description'
)

【讨论】:

  • 是的,我执行了“双击并拖动”而不是“选择、CTRL+C、CTRL+V”,因此不包括引号。我正在谈论的代码(和删除线)是以前的代码,我认为这仍然是一个问题,而问题实际上出在 foreach() 中,其中“Array”的值被添加到某处。
  • @IlyasMimouni 附加信息将始终对 OP 有所帮助。
猜你喜欢
  • 2018-10-02
  • 2014-07-07
  • 2020-06-22
  • 2018-10-29
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2015-12-07
  • 2019-09-22
相关资源
最近更新 更多