2012-03-12 107 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