【问题标题】:PHP - How to format list of URIs in an array to fill other arrayPHP - 如何格式化数组中的 URI 列表以填充其他数组
【发布时间】:2019-08-22 07:10:56
【问题描述】:

我遇到了类似的问题:PHP - How to format data for in_array

我有一个comma separated list of URIs in 1 database field。所有 URI 都将用于排除数组,如 Cookie、URI、ID。排除的 Cookie 是硬编码的,但不是 URI。它们来自一个 DB Query,查询的结果可以是多个,但不能超过 10 或 20。那么,如果数据库中有超过 1 个 URI,查询的输出如何格式化?

$lsc_exclude_uri_query = xtDBquery("SELECT 
                            lsc.option_value // URIs 
                            FROM lsc_config lsc
                            WHERE lsc.option_id = 9");

while ($exclude_uri_query = xtc_db_fetch_array($lsc_exclude_uri_query)) {
    if (xtc_not_null($exclude_uri_query['option_value'])) {
        $uris = $exclude_uri_query['option_value'];
    }
}


// This is the array of excludes

if (!isset($_COOKIE[$lsc_customer_login]) && !isset($_COOKIE[$lsc_admin]) && !strstr($PHP_SELF, 'result from db query')) {
}

【问题讨论】:

  • 旧的explode() 函数怎么样?除此之外:规范化您的数据库结构。一列中以逗号分隔的字符串是不好的设计。
  • 好主意,但没有多大帮助,因为我可以生成多个 !strstr($PHP_SELF, 'URI') 字符串。据我了解 explode 它会生成一个新数组,那么您认为 explode 可以提供什么帮助?我不能改变设计。 URI 必须在 1 db 字段中。
  • 为什么不使用您其他问题的答案? FIND_IN_SET 非常适合作为您的问题的答案。爆炸的答案也很好:在一个大数组中分解所有结果集并使用 in_array() 对其进行检查。很简单。
  • 使用另一个答案中的 FIND_IN_SET 是我的第一个想法,但不能用于此任务。我不比较其他答案中的值,并且我有超过 1 个结果。另一个答案总是只有 1 个结果。
  • 如何处理多个结果?您已经有一个 while 循环。当结果集中包含您要搜索的项目时,使用一个标志会怎样?您是否尝试过将找到的结果集分解为一个大数组并使用 in_array() 进行检查的爆炸建议

标签: php arrays


【解决方案1】:

答案来了。 @Marcel 已经解决了,但是我的大脑因为想太多而被阻塞而忽略了它的帮助,对不起 Marcel :(

$lsc_exclude_uri_query = xtDBquery("SELECT 
                            lsc.option_value 
                            FROM lsc_config lsc
                            WHERE lsc.option_id = 9");

while ($exclude_uri_query = xtc_db_fetch_array($lsc_exclude_uri_query)) {
    if (xtc_not_null($exclude_uri_query['option_value'])) {
        $uris = $exclude_uri_query['option_value'];
    }
}

$urilist = array($uris);
$lsc_customer_login = $lsc_cookie_name;
$lsc_admin = "lsc_admin";
    if (!isset($_COOKIE[$lsc_customer_login]) && !isset($_COOKIE[$lsc_admin]) && !in_array($_SERVER['REQUEST_URI'],$urilist)) {
}

【讨论】:

  • 您的循环每次都会覆盖$uris 变量,因此它只会包含最后一行不为空的值。但是您在查询中没有ORDER BY,因此无法预测哪一个将是最后一行。为什么不直接将AND option_VALUE IS NOT NULL 放在查询中,这样就不必在循环中进行测试了?
  • 如果选项值是逗号分隔的列表,使用explode()将其拆分为一个数组。
【解决方案2】:

使用explode() 将选项值拆分为一个数组。然后使用array_merge() 将它们全部组合成一个结果数组。

$urllist = [];
$lsc_exclude_uri_query = xtDBquery("SELECT 
                            lsc.option_value 
                            FROM lsc_config lsc
                            WHERE lsc.option_id = 9 AND lsc.option_value IS NOT NULL");

while ($exclude_uri_query = xtc_db_fetch_array($lsc_exclude_uri_query)) {
    $uris = explode(','. $exclude_uri_query['option_value']);
    $urllist = array_merge($urllist, $uris);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2020-10-16
    相关资源
    最近更新 更多