如何使用define()列表有效地创建数组?

时间:2016-06-10 15:39:52

标签: php sql arrays loops foreach

我有一个需要在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查询中工作)

2 个答案:

答案 0 :(得分:3)

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

话虽如此,您当前的代码确实对我有用,并包含第一个和最后一个项目。但是它确实有一个额外的数组级别: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< 5.6

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

如果您翻转str_replaceexplode,则会获得包含所有项目的单维数组:

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

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

答案 1 :(得分: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'
)