PHP strpos()函数比较数字中的字符串冲突

时间:2013-12-26 13:37:16

标签: php strpos

我正在使用strpos()函数来查找数组键成员中的字符串。

    foreach($_POST as $k => $v){
    // for all types of questions of chapter 1 only
    $count = 0;
    if(strpos($k, 'chap1') !== false){
        $count++;
    }
}

我知道它只有在键(chap1e1,chap1m1,chap1h1)之后才能工作,但是当涉及到(chap10e1,chap10m1,chap10h1)时,我的逻辑将无法解决这些问题。

有没有办法,所以,我可以区分(第1章和第10章)之间的比较?

或者,有没有其他方法可以做到这一点?请给我一些想法。谢谢!

4 个答案:

答案 0 :(得分:3)

基本上,preg_match会做到这一点:

$count = 0;
foreach($_POST as $k => $v)
{
    if (preg_match('/\bchap1[^\d]{0,1}/', $k)) ++$count;
}

模式的工作原理:

  • \b:一个词边界。匹配chap1,但不匹配schap,它不能成为更大字符串的一部分
  • chap1:匹配一个文字字符串(因为它前面有\b,这个文字不能以字符开头,但它可以是字符串的开头,例如
  • [^\d]{0,1}:匹配数字之外的任何内容为零或一次。因此chap10不匹配,但chap1e

要立即处理所有这些“章节”,请尝试以下方法:

$count = array();
foreach($_POST as $k => $v)
{
    if (preg_match('/\bchap(\d+)(.*)/', $k, $match))
    {
        $match[2] = $match[2] ? $match[2] : 'empty';//default value
        if (!isset($count[$match[1]])) $count[$match[1]] = array();
        $count[$match[1]][] = $match[2];
    }
}

现在这个模式有点复杂,但并不多

  • \bchap:与之前相同,wourd boundary + literal
  • (\d+):匹配 AND GROUP 所有数字(一个或多个,不接受任何数字)。我们稍后会将此群组用作关键字($match[1]
  • (.*):匹配并分组字符串的其余部分。如果那里什么也没有,那没关系。如果您不想匹配chap1等密钥,并且在数字后需要,请将*星号替换为加号

现在,我已将$count变量转换为数组,如下所示:

array('1' => array('e1', 'a3'),
      '10'=> array('s3')
);

$_POST看起来像这样:

array(
    chap1e1 => ?,
    chap1a3 => ?,
    chap10s3=> ?
)

您对这些值的处理取决于您自己。您可以做的一件事是按“chapter”

对键值对进行分组
$count = array();
foreach($_POST as $k => $v)
{
    if (preg_match('/\bchap(\d+)/', $k, $match))
    {
        if (!isset($count[$match[1]])) $count[$match[1]] = array();
        $count[$match[1]][$k] = $v;//$match[1] == chap -> array with full post key->value pairs
    }
}

请注意,如果这对您来说是一个可行的解决方案,那么简化表达式并不是一个坏主意(因为正则表达式最好保持简单),并且最后省略(.*)。 使用上面的代码,要获得任何“chap \ d”参数的计数,只需使用:

echo 'count 1: ', isset($count[1]) ? count($count[1]) : 0, PHP_EOL;

答案 1 :(得分:1)

您可能需要调整注册代码,无论如何这将开始

if (preg_match("/chap[0-9]{1,3}/i", $v, $match)) {
    $count++;
}

答案 2 :(得分:0)

您可以使用:

$rest = substr($k, 0, 5);

然后将你的字符串比作($ rest!=='chap1')

我希望这有效。

答案 3 :(得分:0)

我在Execute PHP Online

上测试了以下代码
<?php
    $_POST['chap1e1'] = 'test1';
    $_POST['chap10e1'] = 'test2';
    foreach($_POST as $k => $v){
    // for all types of questions of chapter 1 only
    $count = 0;
    var_dump($k);
    var_dump(strpos($k, 'chap1'));
    var_dump(strpos($k, 'chap1') !== false);
}
foreach($_POST as $k => $v){
    // for all types of questions of chapter 1 only
    //$count = 0;
    var_dump($count);
    if(strpos($k, 'chap1') !== false){
        $count++;
    }
}
echo $count;
?>

获得以下输出 string(7)“chap1e1”int(0)bool(true)string(8)“chap10e1”int(0)bool(true)int(0)int(1)2

表示strpos能够在“chap10e1”中找到“chap1” 但$ count总数是错误的,因为你的代码总是在foreach循环中将$ count重置为0