2012-03-22 1 views
1

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

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 
      ... 
+0

Дайте нам эти данные как var_dump, пожалуйста – safarov

+0

Вы используете Chrome? Это может быть проблемой: http://stackoverflow.com/questions/640745/google-chrome-javascript-associative-arrays-evaluated-out-of-sequence –

+0

@safarov Я только что обновил свой вопрос, чтобы включить var_dump внизу – ddan

ответ

1

В 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}] 

Если вам необходимо отслеживать id, поместите его в свой 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() 
    ); 
} 
+0

Вы ошибаетесь в отношении 'ассоциативной по умолчанию' части. Его число – Starx

+0

http://sg.php.net/manual/en/language.types.array.php 'Массив в PHP на самом деле является упорядоченной картой. Карта - это тип, который связывает значения с ключами. –

+0

array_values ​​() работал. спасибо человеку – ddan

Смежные вопросы