2011-05-13 18 views
1

我想在主機和我的網頁之間使用JSON傳輸數組。在主機上,我有一個php腳本,它從mysql表中讀取一些行並從中創建一個數組。強制json_encode編碼(稀疏)數組作爲索引數組在php

$query="select ID,val,size from db;"; 
$result=mysql_query($query); 
while ($row=mysql_fetch_assoc($result)) { 
    $idx= (int) $row['ID']; 
    $data[$idx]['val']=$row['val']; 
    $data[$idx]['size']=$row['size']; 
} 

echo json_encode($data); 

通常,ID的遞增直線之間,例如,在0和99。在這種情況下,輸出json_encoded是一個數組(和如果我將被解釋爲以JavaScript陣列...一個array.length,我得到100作爲答案)....
有時,表中缺少一些行(也許沒有idx = 40的行)...在這種情況下,數組是json_encoded作爲對象的集合。在JavaScript中,如果我嘗試查看array.length,則會得到未定義的結果。我想強制數據數組被解釋爲一個索引數組,其空/行值爲空。是否有捷徑可尋?它看起來像json_encode函數有一個選項強制編碼作爲關聯數組,但不是相反。

Thx。

+0

只是好奇,但你需要什麼長度?難道你不能像'$ data ['length'] = count($ data)''那樣在數組中設置一個長度屬性嗎?如果您需要循環數據的長度,那麼數字中的空白將會弄亂/報告不正確的長度值。你可以使用'for in'循環(類似於PHP的foreach)。 – 2011-05-13 20:46:21

回答

1
$query="select ID,val,size from db;"; 
$result=mysql_query($query); 
$maxId = -1; 
$defaultValue = null; 
while ($row=mysql_fetch_assoc($result)) { 
    $idx= (int) $row['ID']; 
    if($maxId < $idx) 
     $maxId = $idx; 
    $data[$idx]['val']=$row['val']; 
    $data[$idx]['size']=$row['size']; 
} 
for($i=0;$i<$maxId;$i++) 
    if(!isset($data[$i)) 
     $data[$i] = $defaultValue; 
echo json_encode($data); 
+0

我注意到的一件事情是,如果行從mysql數據庫中無序地返回(即,idx = 1首先出現,然後是idx = 0),那麼即使它是一個完整的數組,它也會被編碼爲一個對象的集合,而不是一個數組...而提前分配和初始化數組似乎工作得很好。 – Ram 2011-05-13 21:17:58

0

這很煩人,但這是你的Javascript。我通常解決這通過添加另一個級別我的數據結構:

$data['size'] = count($myarray); 
$data['array'] = $myarray; 

echo json_encode($data); 

這樣,你得到包括「免費」的長度,而無需做任何客戶端循環/計數。

1

我將$ data定義爲一個完整數組,然後替換它內部的元素。

$data = array_fill($starting_index, 100, null); 

$query="select ID,val,size from db;"; 
$result=mysql_query($query); 
while ($row=mysql_fetch_assoc($result)) { 
    $idx= (int) $row['ID']; 
    $data[$idx]['val']=$row['val']; 
    $data[$idx]['size']=$row['size']; 
} 

echo json_encode($data); 
+0

謝謝,這似乎最適合我。 – Ram 2011-05-13 21:15:27