我正在使用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章)之间的比较?
或者,有没有其他方法可以做到这一点?请给我一些想法。谢谢!
答案 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)
<?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