gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:05:55 28 4
gpt4 key购买 nike

我正在使用 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) 时,我的逻辑不会对这些起作用。

有没有什么办法,让我可以区分(chap1 & chap10)之间的比较?

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

最佳答案

基本上,preg_match 会这样做:

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

模式的工作原理:

  • \b:单词边界。匹配 chap1,但不匹配 schap,它不能是更大字符串的一部分
  • chap1:匹配一个文字串(因为它前面有\b,这个文字前面不能有char,但是可以是a的开头字符串,例如
  • [^\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: 和之前一样,word boundary + literal
  • (\d+):匹配AND GROUP所有数字(一个或多个,不接受任何数字)。我们稍后使用这个组作为键 ($match[1])
  • (.*):匹配并分组字符串的其余部分。如果那里什么都没有,那没关系。如果您不想匹配 chap1 之类的键,并且需要在数字之后添加一些内容,请将 * 星号替换为加号<

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

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

$_POST 看起来像这样时:

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

您如何处理这些值取决于您。您可以做的一件事是按“章节”

对键值对进行分组
$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;

关于PHP strpos() 函数比较数字中的字符串冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20785828/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com