我有一个需要在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查询中工作)
答案 0 :(得分:3)
首先,我会质疑存储一个像常量一样的字符串列表的决定。使用数据结构(如数组)是理想的。
话虽如此,您当前的代码确实对我有用,并包含第一个和最后一个项目。但是它确实有一个额外的数组级别:https://3v4l.org/k9qQO
假设您确实需要使用常量,您有几个选项:
如果您使用的是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']);
在SQL查询中使用此数组很容易修改。在构建查询时,只需使用implode
即可。
$vars = "'" . implode("', '", ORG_CHART_VARS) . "'";
$query = "SELECT foo FROM table WHERE bar IN ($vars)";
否则,如果您坚持使用现有常量,则可以稍微改进解析代码。
如果您翻转str_replace
和explode
,则会获得包含所有项目的单维数组:
$allMetaKeys = explode(", ", str_replace("'","", ORG_CHART_VARS));
答案 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'
)