jQuery заказать JSON список из PHP? - PullRequest
1 голос
/ 22 марта 2012

Я отправляю упорядоченный список json_encode некоторых таблиц MySQL из php, но когда я получаю его с помощью jquery, он уже не в порядке?все работает нормально и в порядке на стороне php.У меня проблемы со стороны клиента.Я думаю, что проблема в том, что я посылаю многомерный массив из PHP как JSON.что было бы наиболее эффективным решением?также почему порядок изменился при получении jQuery.

КОД PHP:

$user_data = array();

while($row = mysql_fetch_array($retval, MYSQL_ASSOC){
    $user_id = $row['user_id'];

    if(!isset($user_data[$user_id]){
        $user_data[$user_id] = array(
            'first_name'    => $row['first_name'],
            'last_name'     => $row['last_name'],
            'dept'          => $row['dept'],
            'quals'         => array()
        );
    }

    $quals = array(
        'qual_cat'    => $row['qual_cat'],
        'qual'        => $row['qual'],
        'count'       => $row['count']
    )

    $user_data[$user_id]['quals'][] = $quals;
}


echo json_encode($user_data);

jQuery:

$.post('page.php', function(post){
    $.each(post, function(i,data){
        alert(data.first_name+' '+data.last_name+' - '+data.dept);
    });
});

PHP VAR_DUMP:

array
10 => 
array
  'first_name' => string 'David' (length=5)
  'last_name' => string 'Dan' (length=3)
  'dept' => string 'web' (length=3)
  'count' => string '5' (length=1)
  'quals' => 
    array
      0 => 
        array
          ...
      1 => 
        array
          ...
      2 => 
        array
          ...
      3 => 
        array
          ...
      4 => 
        array
          ...

1 Ответ

1 голос
/ 22 марта 2012

В php массив по умолчанию является ассоциативным, поэтому у вас такое поведение, так как порядок ассоциативного массива не гарантируется (согласно объяснению в ссылке, приведенной в benedict_w).

Чтобы преодолеть это, вы можетепопробуйте следующее:

echo json_encode(array_values($user_data));

Это эффективно превратит ваш JSON из

["10":{prop1:val1, prop2:val2}, "25":{prop1:val1, prop2:val2}]

в

[{prop1:val1, prop2:val2}, {prop1:val1, prop2:val2}]

Если вам нужно отслеживать идентификатор, поставьтеэто внутри ваших user_data в вашем php:

if(!isset($user_data[$user_id]){
    $user_data[$user_id] = array(
        'id' => $user_id,
        'first_name'    => $row['first_name'],
        'last_name'     => $row['last_name'],
        'dept'          => $row['dept'],
        'quals'         => array()
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...