【问题标题】:php match variable names using wildcardphp使用通配符匹配变量名
【发布时间】:2017-12-14 18:12:54
【问题描述】:

我需要检查变量是否存在。

变量不一定按照 1.2.3 的顺序创建。它们可以创建为 2.4.3.1。这些也不是在同一页面上同时创建的。所以我只想检查变量是否存在。

$_SESSION['rule1']
$_SESSION['rule2']
$_SESSION['rule3']
$_SESSION['rule4']

<?
 if(isset($_SESSION['rule'.*wildcard*'])) {

 do something

 }
?>

我不知道该怎么做。答案可能在于 REGEX,但我对 REGEX 感到很害怕。

【问题讨论】:

  • 是的,我改写了这个问题。
  • 在这种特殊情况下,可以在规则 1 之前创建规则 4。所以我只需要知道 rule* 是否存在。和 rule* 可以是 1-??。因此,变量existing 的第一个实例赢得了比赛。
  • 好吧。有一系列的网络表格。用户可以“选择”任何要编辑的项目。所以假设他们编辑了第 3 项。一旦他们完成编辑,这个“规则 3”现在就存在了。因此,由于他们选择了第 3 项而不是第 1 项,我无法检测规则 1 是否存在。我需要检测现在是否存在任何“规则*”变量。如果是,我需要做一些事情。
  • 我想我可以使用 for 循环。检测项目的数量并遍历每个项目,直到 [rule.$i] 存在,做一些事情然后退出 for 循环。我只是认为这比通配符场景更努力。
  • 这里有类似问题:stackoverflow.com/questions/5112167/… 所以,您似乎需要检查 $_SESSION 数组...。

标签: php variables wildcard


【解决方案1】:

如果您不知道需要知道会话数组中的哪个规则*键,只有当它们中的任何一个存在时,您可以试试这个:

<?php

function prefixExists(array $assoc_array, $prefix)
{
    $length = strlen($prefix);
    foreach ($assoc_array as $key => $unused)
    {
        if (strncmp($key, $prefix, $length) === 0) {
            return true;
        }
    }
    return false;
}

测试如下:

session_start();
var_dump(prefixExists($_SESSION, 'rule'));
$_SESSION['rule3'] = 'some value from form';
var_dump(prefixExists($_SESSION, 'rule'));

给出输出:

bool(false)
bool(true)

【讨论】:

  • @astrangeloop - 稍微快一点的方法strpos($key, $prefix) === 0
【解决方案2】:

这是另一个使用preg_match的解决方案:

function arrayHasSimilarKey(array $array, $matchKey)
{
    $pattern = '/' . str_replace('*', '.*', $matchKey) . '/i';
    foreach ($array as $key => $value) { echo $key.PHP_EOL;
        if (preg_match($pattern, $key)) {
            return true;
        }
    }

    return false;
}

$testArray = ['abc' => 1, 'test_1' => 1, 'test_2' => 1, 'test2_1' => 1, 'test3_2' => 1];
$tests = [
    0 => arrayHasSimilarKey($testArray, 'test*'),    // true
    1 => arrayHasSimilarKey($testArray, 'test2*_2'), // false
    2 => arrayHasSimilarKey($testArray, 'test3*'),   // true
    3 => arrayHasSimilarKey($testArray, 'test3*_1'), // false
    4 => arrayHasSimilarKey($testArray, '*_2')       // false
];

var_dump($tests);

在您的情况下,$testArray 将是 $_SESSION

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2018-03-22
    • 1970-01-01
    • 2014-06-26
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多