PHP foreach 数组在爆炸后缺少最后一个元素,计数函数
PHP foreach array missing last element after explode, count functions
我的 foreach 循环获取 $_POST 数据并使用 explode
将 ID 号与 $key
分开,以便我可以在我的数据库中使用这些 ID 号。最后,我继续并根据 ID 号
创建子数组
除了我缺少最后一个子数组外,这工作正常。我 $_POST 数据应该变成 16 个子数组,但我只得到 15。当我 var_dump 在 foreach 之前的 $_POST 时,我显示所有 16。当我 var_dump 之后爆炸定义的变量foreach,但在if{}
之前,我可以看到第16个子数组数据减去一个元素,即id号。
那么为什么 explode 会失去这最后一个元素呢?限制在这里似乎不适用,而且 strtok 或 preg_split 似乎没有完成我需要完成的工作。
顺便说一下,我尝试将计数语句修改为 if(count($newgamearr)>0);
,我确实得到了第 16 个 id 和子数组,但还有一大堆未定义的偏移量:1 个错误,最终是一个空数据集。
public function pickArray() {
$template = [
'gameid'=> '',
'ats'=>'',
'winner'=>'',
'ou'=>'',
'lck'=>'',
'userid'=>'',
];
$gamearr = [];
$mainarray = [];
$userid = $this->session->userdata('user_id')->id;
$gamearr = [];
$mainarray = [];
$gamearr['gameid'] = NULL;
foreach($_POST as $key=>$post_data){
$newgameID = explode('gameID',$key);
if(count($newgameID)>1) {
if($gamearr['gameid']) {
$mainarray[] = $gamearr;
}
$gamearr = $template;
$gamearr['gameid'] = $newgameID[1];
$gamearr['userid'] = $userid;
continue;}
$newats = explode('ats',$key);
if(count($newats)>1) {
$gamearr['ats'] = $post_data;
continue;}
$newwinner = explode('winner',$key);
if(count($newwinner)>1) {
$gamearr['winner'] = $post_data;
continue;}
$newou = explode('ou',$key);
if(count($newou)>1) {
$gamearr['ou'] = $post_data;
continue;}
$newlock = explode('lck',$key);
if(count($newlock)>1) {
$gamearr['lck'] = $post_data;
continue;}
}
这是 var_dump 输出(来自 foreach 之前):
array(55) {
["gameID1"]=> string(1) "1"
["ats1"]=> string(3) "SEA"
["ou1"]=> string(4) "OVER"
["winner1"]=> string(3) "SEA"
["lck1"]=> string(0) ""
["gameID2"]=> string(1) "2"
["ats2"]=> string(2) "NO"
["ou2"]=> string(4) "OVER"
["winner2"]=> string(2) "NO"
["lck2"]=> string(0) ""
["gameID3"]=> string(1) "3"
["ats3"]=> string(3) "STL"
["ou3"]=> string(4) "OVER"
["winner3"]=> string(3) "STL"
["lck3"]=> string(0) ""
["gameID4"]=> string(1) "4"
["winner4"]=> string(0) ""
["lck4"]=> string(0) ""
["gameID5"]=> string(1) "5"
["winner5"]=> string(0) ""
["lck5"]=> string(0) ""
["gameID6"]=> string(1) "6"
["winner6"]=> string(0) ""
["lck6"]=> string(0) ""
["gameID7"]=> string(1) "7"
["winner7"]=> string(0) ""
["lck7"]=> string(0) ""
["gameID8"]=> string(1) "8"
["winner8"]=> string(0) ""
["lck8"]=> string(0) ""
["gameID9"]=> string(1) "9"
["winner9"]=> string(0) ""
["lck9"]=> string(0) ""
["gameID10"]=> string(2) "10"
["winner10"]=> string(0) ""
["lck10"]=> string(0) ""
["gameID11"]=> string(2) "11"
["winner11"]=> string(0) ""
["lck11"]=> string(0) ""
["gameID12"]=> string(2) "12"
["winner12"]=> string(0) ""
["lck12"]=> string(0) ""
["gameID13"]=> string(2) "13"
["winner13"]=> string(0) ""
["lck13"]=> string(0) ""
["gameID14"]=> string(2) "14"
["winner14"]=> string(0) ""
["lck14"]=> string(0) ""
["gameID15"]=> string(2) "15"
["winner15"]=> string(0) ""
["lck15"]=> string(0) ""
["gameID16"]=> string(2) "16"
["winner16"]=> string(0) ""
["lck16"]=> string(0) ""
["submitPicks"]=> string(13) "Submit Picks!"
}
if($gamearr['gameid'])
的第一次检查将不匹配,因为该值仍然为空。
您在这里所做的是将添加委托到 $mainarray
以进行循环的下一次迭代,我认为您的数据在此过程中会不同步,与其余数据匹配与随后的游戏ID。
将 $mainarr
添加进一步向下移动,其中 $gamearr['gameid']
定义为当前 $newgameID
:
if(count($newgameID) > 1) {
$gamearr = $template;
$gamearr['gameid'] = $newgameID[1];
$gamearr['userid'] = $userid;
if($gamearr['gameid']) {
$mainarray[] = $gamearr;
}
continue;
}
此外,经过此步,由于您已经验证了$newgameID
,因此if($gamearr['gameid'])
是多余的,因此您可以剪掉该条件。
==== 编辑:另一种方式...... ====
您可以这样做来缩短它:
foreach($_POST as $key=>$post_data) {
preg_match("#([a-zA-Z]+)([0-9]+)#", $key, $data);
if (isset($data[2])) {
$id = $data[2];
$var = strtolower($data[1]);
if ($var == 'gameid') continue; // Unless you want to add that in too.
$mainarray[$id][$var] = $post_data;
}
}
会让您得到布局更整洁的 $mainarray
,而且您也不需要 $template
,因为它只是小写的键。 :)
我的 foreach 循环获取 $_POST 数据并使用 explode
将 ID 号与 $key
分开,以便我可以在我的数据库中使用这些 ID 号。最后,我继续并根据 ID 号
除了我缺少最后一个子数组外,这工作正常。我 $_POST 数据应该变成 16 个子数组,但我只得到 15。当我 var_dump 在 foreach 之前的 $_POST 时,我显示所有 16。当我 var_dump 之后爆炸定义的变量foreach,但在if{}
之前,我可以看到第16个子数组数据减去一个元素,即id号。
那么为什么 explode 会失去这最后一个元素呢?限制在这里似乎不适用,而且 strtok 或 preg_split 似乎没有完成我需要完成的工作。
顺便说一下,我尝试将计数语句修改为 if(count($newgamearr)>0);
,我确实得到了第 16 个 id 和子数组,但还有一大堆未定义的偏移量:1 个错误,最终是一个空数据集。
public function pickArray() {
$template = [
'gameid'=> '',
'ats'=>'',
'winner'=>'',
'ou'=>'',
'lck'=>'',
'userid'=>'',
];
$gamearr = [];
$mainarray = [];
$userid = $this->session->userdata('user_id')->id;
$gamearr = [];
$mainarray = [];
$gamearr['gameid'] = NULL;
foreach($_POST as $key=>$post_data){
$newgameID = explode('gameID',$key);
if(count($newgameID)>1) {
if($gamearr['gameid']) {
$mainarray[] = $gamearr;
}
$gamearr = $template;
$gamearr['gameid'] = $newgameID[1];
$gamearr['userid'] = $userid;
continue;}
$newats = explode('ats',$key);
if(count($newats)>1) {
$gamearr['ats'] = $post_data;
continue;}
$newwinner = explode('winner',$key);
if(count($newwinner)>1) {
$gamearr['winner'] = $post_data;
continue;}
$newou = explode('ou',$key);
if(count($newou)>1) {
$gamearr['ou'] = $post_data;
continue;}
$newlock = explode('lck',$key);
if(count($newlock)>1) {
$gamearr['lck'] = $post_data;
continue;}
}
这是 var_dump 输出(来自 foreach 之前):
array(55) {
["gameID1"]=> string(1) "1"
["ats1"]=> string(3) "SEA"
["ou1"]=> string(4) "OVER"
["winner1"]=> string(3) "SEA"
["lck1"]=> string(0) ""
["gameID2"]=> string(1) "2"
["ats2"]=> string(2) "NO"
["ou2"]=> string(4) "OVER"
["winner2"]=> string(2) "NO"
["lck2"]=> string(0) ""
["gameID3"]=> string(1) "3"
["ats3"]=> string(3) "STL"
["ou3"]=> string(4) "OVER"
["winner3"]=> string(3) "STL"
["lck3"]=> string(0) ""
["gameID4"]=> string(1) "4"
["winner4"]=> string(0) ""
["lck4"]=> string(0) ""
["gameID5"]=> string(1) "5"
["winner5"]=> string(0) ""
["lck5"]=> string(0) ""
["gameID6"]=> string(1) "6"
["winner6"]=> string(0) ""
["lck6"]=> string(0) ""
["gameID7"]=> string(1) "7"
["winner7"]=> string(0) ""
["lck7"]=> string(0) ""
["gameID8"]=> string(1) "8"
["winner8"]=> string(0) ""
["lck8"]=> string(0) ""
["gameID9"]=> string(1) "9"
["winner9"]=> string(0) ""
["lck9"]=> string(0) ""
["gameID10"]=> string(2) "10"
["winner10"]=> string(0) ""
["lck10"]=> string(0) ""
["gameID11"]=> string(2) "11"
["winner11"]=> string(0) ""
["lck11"]=> string(0) ""
["gameID12"]=> string(2) "12"
["winner12"]=> string(0) ""
["lck12"]=> string(0) ""
["gameID13"]=> string(2) "13"
["winner13"]=> string(0) ""
["lck13"]=> string(0) ""
["gameID14"]=> string(2) "14"
["winner14"]=> string(0) ""
["lck14"]=> string(0) ""
["gameID15"]=> string(2) "15"
["winner15"]=> string(0) ""
["lck15"]=> string(0) ""
["gameID16"]=> string(2) "16"
["winner16"]=> string(0) ""
["lck16"]=> string(0) ""
["submitPicks"]=> string(13) "Submit Picks!"
}
if($gamearr['gameid'])
的第一次检查将不匹配,因为该值仍然为空。
您在这里所做的是将添加委托到 $mainarray
以进行循环的下一次迭代,我认为您的数据在此过程中会不同步,与其余数据匹配与随后的游戏ID。
将 $mainarr
添加进一步向下移动,其中 $gamearr['gameid']
定义为当前 $newgameID
:
if(count($newgameID) > 1) {
$gamearr = $template;
$gamearr['gameid'] = $newgameID[1];
$gamearr['userid'] = $userid;
if($gamearr['gameid']) {
$mainarray[] = $gamearr;
}
continue;
}
此外,经过此步,由于您已经验证了$newgameID
,因此if($gamearr['gameid'])
是多余的,因此您可以剪掉该条件。
==== 编辑:另一种方式...... ====
您可以这样做来缩短它:
foreach($_POST as $key=>$post_data) {
preg_match("#([a-zA-Z]+)([0-9]+)#", $key, $data);
if (isset($data[2])) {
$id = $data[2];
$var = strtolower($data[1]);
if ($var == 'gameid') continue; // Unless you want to add that in too.
$mainarray[$id][$var] = $post_data;
}
}
会让您得到布局更整洁的 $mainarray
,而且您也不需要 $template
,因为它只是小写的键。 :)