2012-03-12 64 views
0

我有一組數據未歸一化。我在PHP中進行規範化,它工作得很好。創建一個PHP版本的PHP多維關聯陣列

數據集看起來像這樣(截圖如下),它是一個很大的壽。我只對類別類型感興趣。有了這兩個,我可以製作出好的桌子和菜單。

問題

現在的問題是,我切換到一個AJAX系統和數據不再進入PHP。相反,它使用node.js/mongodb直接進入頁面。有沒有一種方法可以讓我做這樣的事情:

<script type="text/javascript"> 

// Array containing all the objects from the server 
// looks like this 
var data = [Object, Object, Object]; 
var artikelen = []; 

for(var i=0; i<data.length; i++){ 
    artikelen[data[i].categorie][data[i].type][] = data[i]; 
} 

</script> 

// ----------------
老樣子
// ------ -----------

在PHP我這樣做:

$sql = "SELECT * 
     FROM mydb 
     WHERE merk = 'webecos' 
     ORDER BY categorie, type, code"; 

$result = $wpdb->get_results($sql); 

foreach($result as $row){ 
    $artikelen[$row->categorie][$row->type][] = $row; 
} 

現在我可以好好排序表/菜單與嵌套循環。我使用的代碼是這樣的。

<ul id="inkoop_menu"> 
    <?php foreach ($artikelen as $categorie => $row): ?> 
    <li> 
     <a class="inkoop_button" data-menu="categorie" href="#"> 
      <?=$categorie; ?> 
     </a> 
     <ul> 
      <?php foreach ($row as $type => $artikel): ?> 
      <li> 
       <a class="inkoop_button" data-menu="type" href="#"> 
        <?=$type; ?> 
       </a> 
      </li> 
      <?php endforeach; ?> 
     </ul> 
    </li> 
    <?php endforeach; ?> 
</ul> 

編輯

也許這是一個只有更好理解。我後面的陣列是這樣的:

array['categorie-name']['type-name'][x] = whole object;

enter image description here

+0

JavaScript沒有像PHP的'[] ='這樣的推式運算符,您需要使用'push'來代替。 – Gumbo 2012-03-12 20:07:14

回答

1

我不太確定我完全關注你,但你的意思是這樣嗎?

var data = [Object, Object, Object]; 
var artikelen = []; 

for(var i=0; i<data.length; i++){ 

    if(!artikelen[data[i].category]) 
     artikelen[data[i].category] = new Array(); 

    if(!artikelen[data[i].category][data[i].type]) 
     artikelen[data[i].category][data[i].type] = new Array(); 

    artikelen[data[i].category][data[i].type].push(data[i]); 
} 

更完整的例子:(也注意我把類別,而不是分類,如果需要改變)。

<script language="javascript" type="text/javascript"> 

var obj1 = new Object(); 
obj1.category = 1; 
obj1.type = 2; 
obj1.id = 1; 

var obj2 = new Object(); 
obj2.category = 1; 
obj2.type = 2; 
obj2.id = 2; 

var obj3 = new Object(); 
obj3.category = 2; 
obj3.type = 4; 
obj3.id = 3; 


// Array containing all the objects from the server 
// looks like this 
var data = [obj1, obj2, obj3]; 
var artikelen = []; 

for(var i=0; i<data.length; i++){ 

    if(!artikelen[data[i].category]) 
     artikelen[data[i].category] = new Array(); 

    if(!artikelen[data[i].category][data[i].type]) 
     artikelen[data[i].category][data[i].type] = new Array(); 

    artikelen[data[i].category][data[i].type].push(data[i]); 
} 

alert(artikelen[1][2]); // expected [object], [object] 

alert(artikelen[1][2][0].type); // expected 2 

</script> 

關鍵的事情,從這個方法帶走:

  • 檢查數組中鍵存在
  • 如果沒有,創建
  • .push可以JavaScript數組上用於添加item to a array

使用字符串作爲對象的類型:

var obj1 = new Object(); 
obj1.category = 1; 
obj1.type = "hello hello"; 
obj1.id = 1; 

var obj2 = new Object(); 
obj2.category = 1; 
obj2.type = 2; 
obj2.id = 2; 

var obj3 = new Object(); 
obj3.category = 2; 
obj3.type = 4; 
obj3.id = 3; 


// Array containing all the objects from the server 
// looks like this 
var data = [obj1, obj2, obj3]; 
var artikelen = []; 

for(var i=0; i<data.length; i++){ 

    if(!artikelen[data[i].category]) 
     artikelen[data[i].category] = new Array(); 

    if(!artikelen[data[i].category][data[i].type]) 
     artikelen[data[i].category][data[i].type] = new Array(); 

    artikelen[data[i].category][data[i].type].push(data[i]); 
} 

alert(artikelen[1][2]); // expected [object], [object] 

alert(artikelen[1]["hello hello"][0].type); // expected "hello hello" 

編輯

我給它多一些,思想和閱讀this後,事實證明,arrays在Javascript不適合用作關聯數組(就像PHP)。實際上,您只是將屬性添加到對象。所以使它變成object反而更好。例如,以下內容:

var obj1 = new Object(); 
obj1.category = 1; 
obj1.type = "hello hello"; 
obj1.id = 1; 

var obj2 = new Object(); 
obj2.category = 1; 
obj2.type = 2; 
obj2.id = 2; 

var obj3 = new Object(); 
obj3.category = 2; 
obj3.type = 4; 
obj3.id = 3; 


// Array containing all the objects from the server 
// looks like this 
var data = [obj1, obj2, obj3]; 
var artikelen = []; 

for(var i=0; i<data.length; i++){ 

    if(!artikelen[data[i].category]) 
     artikelen[data[i].category] = new Object(); 

    if(!artikelen[data[i].category][data[i].type]) 
     artikelen[data[i].category][data[i].type] = new Object(); 

    artikelen[data[i].category][data[i].type] = (data[i]); 
} 

console.dir(artikelen); // if using a debugger with console, gives detailed info 

此外,如果使用調試器,如螢火蟲在Firefox中,你可以看到與console.dir功能的詳細信息。

+0

感謝您的回答,並且我認爲您瞭解了我的概念。我會在幾分鐘內嘗試一下。分類/類別是荷蘭語/英語的事情。我把它切換。我會盡快回復,再次感謝! – 2012-03-12 20:19:10

+0

不幸的是,這不起作用。 Object.categorie是一個字符串,類型也是。如果你看屏幕截圖,分類是字符串的第二列,類型是第五列。沒有行號,它們都是字符串。我編輯了一個更好的截圖。 – 2012-03-12 20:39:13

+0

使用字符串作爲數組索引時,Javascript沒有問題。我會用一個例子更新答案。 – user17753 2012-03-12 20:51:01

1

你還可以用PHP來工作嗎?如果是這樣,您可以始終以JSON格式從服務器獲取數據,並讓客戶端(以您的情況爲JavaScript語言)讀取並解釋它。

+0

我寧可不走那條路。最終整個系統必須是一個node.js/mongodb系統。現在數據與wordpress設置混合在一起。最終,一切都必須在沒有PHP和Mysql的情況下運行。 – 2012-03-12 20:00:09

+0

儘管如此,我認爲如果以JSON格式生成最終數組,您將有更輕鬆的時間。在實際獲取數據的循環內部,使用JSON格式。 – 2012-03-12 20:04:43

+0

數據已經以json格式出現,但它不按類別和類型組織。如果我可以得到以「陣列數組」方式組織,我可以使用模板引擎來創建我需要的所有內容。如果我使用數據庫中的原始JSON,則模板引擎可以使用它。順便說一句,node.js是服務器端JavaScript,所以服務器和客戶端Javascript都是我可以使用的唯一語言。 – 2012-03-12 20:46:57