2016-09-25 66 views
1

我可能找到一种方法来解决我遇到的这个问题,但真的想了解什么语言构造造成它。构建一个数组给PHP未定义的偏移:0

逻辑如下,我想建立一个会话变量,因为用户点击Google地图上的一个路线点阵列。该POST分组是JSON对象:

?waypoint={"waypoint":[{"lat":"23.3","long":"145"}]} 

接受POST和解释的代码是:

<?php 
    session_start(); 
    //session_destroy(); 
    //die; 
    //$waypoints[] = array(); <<== uncomment this and the behaviour changes 
    if (isset ($_GET ['waypoint'])) { 
     $waypoint = $_GET ['waypoint']; 
     $waypoint = json_decode($waypoint,true); 
     print_r($waypoint['waypoint']); <<<========output 1 
     if (isset ($_SESSION ['waypoints'])) { 
      $waypoints = $_SESSION ['waypoints']; 
      $waypoints [] = $waypoint['waypoint']; 
      $_SESSION ['waypoints']=$waypoints; 
     } else { 
      $_SESSION ['waypoints'] = $waypoint['waypoint']; 
      $waypoints[] = $waypoint['waypoint']; 
     } 
    } 

    foreach($_SESSION ['waypoints'] as $var) { 
     var_dump($var); <<<<====== Output 2 
     echo($var[0]['lat']); <<<<==== Here is the problem. 

    }; 
    ?> 

这是问题所在。第一次通过,输出1和2下面提供的输出和用于LAT被输出的正确的值= 23.3

**Output 1:** Array ([0] => Array ([lat] => 23.3 [long] => 145)) 
    ------------------------------------------------------- 
    **Output 2:** 
    array (size=1) 
    0 => 
    array (size=2) 
     'lat' => string '23.3' (length=4) 
     'long' => string '145' (length=3) 

第二呼叫,产生一个错误Notice: Undefined offset: 0和随后的调用都很好,也就是该阵列按预期建立。现在,如果我取消声明waypoints[] = array();它在第一阶段炸弹,但随后所有的运行都没问题。

有人能解释这种行为吗?

谢谢

+0

我们可以假设你确实在这段代码中有一个'session_start()',你没有向我们展示过吗? – RiggsFolly

+0

是的,对不起,我把它遗漏了。我现在将添加 – TrueBlue

回答

1

的问题

您的问题是在的else条件读取$_SESSION ['waypoints'] = $waypoint['waypoint'];第一线。

的修复

如果将其更改为$_SESSION ['waypoints'][] = $waypoint['waypoint'];,那么你应该可以解决你所得到的错误。

阐释

什么你正在寻找echo($var[0]['lat']);是每个航点的包含数组,当他们在你的if$waypoints [] = $waypoint['waypoint'];)条件设定他们做,但不是在你的else条件($_SESSION ['waypoints'] = $waypoint['waypoint'];

+0

谢谢。是的,修复它。我同意RiggsFolly的观点,认为它比需要的更复杂,但是随着我试图解决问题的底部而增长。 – TrueBlue

4

你似乎让生活变得比它需要的复杂一点。

session_start(); 

if (isset ($_GET ['waypoint'])) { 

    $waypoint = json_decode($_GET ['waypoint'],true); 
    print_r($waypoint['waypoint']); <<<========output 1 

    // as whatever happens we are just adding a waypoint 
    // to an array of waypoints in the SESSION variable 
    // this one line will create the $_SESSION['waypoints'][] 
    // or add a new [] to it. 

    $_SESSION['waypoints'][] = $waypoint; 
} 

// Just as belt and brace check, 
// assuming someone could try to pass this code some rubbish 
// like xxx.php&hacker=yes we ought to check before attempting to 
// use the $_SESSION['waypoints'] that one exists 

if (isset($_SESSION['waypoints']) { 
    foreach($_SESSION['waypoints'] as $var) { 
     // $var is now a waypoint array so it is not $var[0]['lat'] 
     echo sprintf('Latitude = %s - Longitude = %s', 
          $var['lat'], 
          $var['long'] 
        ); 
    } 
} 
?> 
+0

感谢您 - 特别是有关“皮带和支架检查”的评论,我会重写我的代码。 – TrueBlue

1
else { 
    $_SESSION ['waypoints'][] = $waypoint['waypoint']; 
}