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,因为它只是小写的键。 :)