2016-09-25 4 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 дают выходы ниже и правильного значение широты выводится = 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

Thankyou. Да, это исправить. Я согласен с 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']; 
} 
Смежные вопросы