Создание версии Javascript многомерного связанного массива PHP - PullRequest
0 голосов
/ 12 марта 2012

У меня есть набор данных, который не нормализован.Я делаю нормализацию в PHP, он работает просто отлично.

Набор данных выглядит так (скриншот ниже), но он намного больше.Я заинтересован только в организации категории и типа .С этими двумя orginized я могу сделать хорошие таблицы и меню.

Проблема

Теперь проблема в том, что я переключаюсь на систему 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

Ответы [ 2 ]

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

Я не совсем уверен, что полностью следую за тобой, но ты имеешь в виду что-то подобное?

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 для добавления элемента в массив

Использование строки в качестве типа для объекта:

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"

EDIT

Я дал еще немного, подумал, и после прочтения 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

Также, если вы используете отладчик, такой как Firebug в Firefox, вы можете просмотреть подробную информацию с помощью функции console.dir.

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

Вы все еще можете работать с PHP? Если это так, вы всегда можете принести данные с сервера в формате JSON и позволить клиенту (в вашем случае, на языке javascript) прочитать и интерпретировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...