Как получить доступ к многомерному массиву PHP в javascript как json-кодированный вариант? - PullRequest
3 голосов
/ 28 июня 2011

После вчерашнего вопроса я узнал, что мне нужно иметь массив в Php и использовать JSON для передачи его в Javascript.У меня все это работает до определенного момента, но мне нужно добавить еще одно измерение в мой массив и не знаю, как.

Текущий массив:

$result = array(
  'NumberSelected' => $number,
  'TargetPerc'     => array (),
  'KpiDescription' => array (),
  'KpiName'        => array (),
  'ValuetoPrint'   => array (),
  'ValueNow'       => array (),
  'ValueCompare'   => array (),
  'Target'         => array (),
  'KpiUnits'       => array ()
);

Но яТеперь нужно заключить это в другое измерение, чтобы отсортировать их по группам.

Это то, что я пробовал:

$result = array(
  $i => array(
    'NumberSelected' => $number,
    'TargetPerc'     => array (),
    'KpiDescription' => array (),
    'KpiName'        => array (),
    'ValuetoPrint'   => array (),
    'ValueNow'       => array (),
    'ValueCompare'   => array (),
    'Target'         => array (),
    'KpiUnits'       => array ()
  )
);

С $i, определенным как 0 двумя строками до этого.Но, похоже, он не распознает массив внешней памяти.Может быть что-то делать с моим кодом сбора, который в настоящее время result.KpiName[i] (переменная JSON передается в эту функцию javascript как result).И я попробовал result.i[KpiName[i]] безуспешно.

Любая помощь будет признательна.

Ответы [ 4 ]

4 голосов
/ 28 июня 2011

Если у вас есть один результат:

$result = array(
    'NumberSelected' => $number,
    'TargetPerc' => array(),
    ....
);

Затем вы хотите добавить его с некоторыми другими результатами:

$result_set = array();
$result_set[] = $result;

На данный момент $result_set - это массив с одним элементом, массив с ключами 'NumberSelected', 'TargetPerc' и т. Д.

Я думаю, что у вас возникла идея иметь массивы в массивах в массивах, поэтому подумайте об этом так: каждый индекс массива является компонентом «пути» к определенному фрагменту данных, как в файловой системе , В этом случае $result_set является наиболее общей частью «пути», как буква диска в Windows. Внутри нашего притворного диска есть несколько папок с именами с номерами, поэтому $result_set[0] - первая папка, $result_set[1] - вторая. В каждой из этих папок есть подпапки, называемые NumberSelected (на самом деле, эта будет похожа на файл, поскольку он имеет скалярное значение), TargetPerc и т. Д., Которые соответствуют второму уровню вашего набора результатов: $result_set[0]['NumberSelected']. Теперь окончательное измерение вашего массива соответствует отдельным файлам внутри каждого из 'TargetPerc', 'KpiDescription' и т. Д., Где файлы, если вы не дали им именованные ключи, именуются числами.

Таким образом, для доступа к первому элементу 'KpiDescription' в первом результате в вашем наборе результатов "путь" вашей файловой системы (согласно аналогии) будет

result_set/0/KpiDescription/0

Теперь переводим его обратно в PHP:

$result_set[0]['KpiDescription'][0]

Легко, правда?

Теперь JSON-часть вашего вопроса: как только вы json_encode это сделаете, это будет выглядеть как большая строка текста в PHP, но волшебная вещь в json_encode заключается в том, что он поддерживает исходную структуру данных, но в JavaScript.

Итак, ваш набор результатов будет выглядеть так:

result_set = [
    {
        NumberSelected: 123,
        TargetPerc: [ ... ],
        KpiDescription: [ ... ]
    }
];

Как видите, Javascript - это просто массив объектов, где у каждого объекта есть некоторые свойства, которые оказываются массивами. Чтобы получить доступ к первому элементу в первом KpiDescription (как выше), вы должны использовать это:

result_set[0].KpiDescription[0]

В качестве альтернативы, поскольку Javascript позволяет вам рассматривать свойства объекта как индексы массива (на самом деле это не вполне true, но это уже другая история), вы можете сделать это:

result_set[0]['KpiDescription'][0]

Выглядит знакомо? Все, чего не хватает в PHP - это ведущий $.

Надеюсь, это поможет вам кое-что прояснить.

0 голосов
/ 28 июня 2011
$result = array(
  'NumberSelected' => $number,
  'TargetPerc'     => array (),
  'KpiDescription' => array (),
  'KpiName'        => array (),
  'ValuetoPrint'   => array (),
  'ValueNow'       => array (),
  'ValueCompare'   => array (),
  'Target'         => array (),
  'KpiUnits'       => array ()
);

$newArray[0] = $result;

- самый простой ответ, который я могу придумать, если не пропущу что-то.

0 голосов
/ 28 июня 2011

Фактический код сбора будет: -

$result[i][KpiName][j]

, где "i" & "j" - индексы вышеуказанного массива.

Надеюсь, это поможет.

0 голосов
/ 28 июня 2011

Вам не нужно устанавливать $ i, для инициализации 3D-массива достаточно $arr = array(array(array()));.

Ваш код должен работать с result[i]['KpiName'][i]

/ Редактировать : добавлены кавычки.Протестировал его с синтаксисом выше, должно работать.Протестировано с:

$(document).ready(function(){
    var arr = new Array();
    arr[0] = new Array();
    arr[0]['test'] = new Array();
    arr[0]['test'][1] = 5;

    alert(arr[0]['test'][1]);
});

Возвращено 5 как ожидалось

...