2013-08-25 4 views
-1

У меня есть двумерный php-массив $ phpar, в котором оба измерения индексируются (0,1,2, ...), а все значения являются простым текстом. В рамках функции JavaScript я хочу преобразовать этот массив в двумерный массив JavaScript. Я знаю, что следующий код не работает, но он иллюстрирует то, что я хочу сделать.преобразовать двумерный массив php в JavaScript

jsfunction() { 
    var jsarray = new Array(); 
    jsarray = <?php json_encode($phpar); ?>; 
} 

Если возвращенное значение есть нечто иное, чем обычный JS массива, как строка JSON, мне нужна помощь при разборе, что в то, что я хочу, пожалуйста.

+0

Что вы сделали должны работать просто отлично, если предположить, что '$ phpar' действительно содержит двумерный массив. (Кроме того, нет необходимости в '= new Array()' вообще, вы просто создаете массив, чтобы выбросить его на следующей строке). Итак, что вы хотите сделать, если это не работает, посмотрите, что получает * браузер * для него, и обновите переменную PHP, чтобы она действительно содержала двумерный массив. –

+0

Обратите внимание, что существует возможная проблема безопасности: когда $ phpar зависит от ввода пользователя, он может содержать строку с тегом, а затем вредоносную информацию, которая будет введена на вашей веб-странице. – AardvarkSoup

+0

Продолжение: добавление параметров JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS в json_encode предотвратит эту и некоторые другие уязвимости, но я бы не посмел сказать, что это предотвращает все возможные атаки.Вероятно, лучше не вставлять динамический контент в свои JS-скрипты напрямую. – AardvarkSoup

ответ

1

Я точно не знаю, где ваша проблема ... но основная работа json_encode просто выглядит следующим образом:

<script type="text/javascript"> 

    var jsarray = <?php echo json_encode($phpar); ?>; 

</script> 

Честно говоря, я не понимаю, почему другие люди предлагая бросать javascript-совместимый объект/массив в строку, и хуже, как они это делали, это неправильный. Если вы хотите строку объекта JSON, это правильный способ сделать это:

<script type="text/javascript"> 

    var jsarray_string = <?php echo json_encode(json_encode($phpar)); ?>; 
    //         ^   ^------ php array to js array 
    //         '------------------ php string to js string 
</script> 

Кстати, JavaScript объекты могут быть доступны как массивы. Пример:

var myArray = {1: 'hi', 2: 'bye'}; 
alert(myArray[2]); // this works! 

Единственное отличие состоит в том, что туАггау не действительно Javascript массив, например, myArray.constructor не Array().

+0

Понял, я с тобой сейчас. Это ** комментарий **, а не ответ. Это то же самое, что и мой первоначальный комментарий: то, что делает OP, должно работать. Пока у нас нет дополнительной информации, ответить на этот вопрос невозможно. –

0

Что вы на самом деле пытаетесь выполнить здесь с точки зрения функциональности вашего приложения?

PHP - это бэкэнд-язык, а JavaScript - внешний язык. Если вам нужен внешний интерфейс для извлечения объекта из бэкэнд для использования в вашем JavaScript, вы должны использовать Ajax, а не вставлять PHP-код в свой JavaScript.

Ваш метод Ajax вызовет соответствующий PHP-метод, используя URL-адрес в стиле MVC ('/ mycontroller/mymethod'). Метод PHP должен использовать ассоциативный массив (ы) использования, поскольку объекты JSON являются парами ключ-значение. Перед возвратом следует использовать json_encode массив.

Вот некоторые примеры PHP код:

<?php #foo.php 

public function bar() { 
    $array = ('first-name' => 'John', 'last-name' => 'Doe'); 
    return json_encode($array); 
} 

На внешнем интерфейсе, ваш объект JSON будет состоять из одних и тех же ключевых пар значений в качестве ассоциативного массива:

var getBar = function() { 
    $.get('/foo/bar', function(data) { 
     var string = 'My name is ' + data.first-name + ' ' + data.last-name'; 
     alert(string); 
    }, json); 
}; 
+0

@Christian Я удалил свои оригинальные комментарии B/C Я думаю, что мы немного чересчур личны. К вашему моменту, есть некоторые ограниченные обстоятельства, когда может иметь смысл, чтобы бэкэнд заполнил встроенный объект JSON. По моим соображениям: 1. Если идти по этому маршруту, лучше, чтобы контроллер выполнял кодировку JSON и печатал объект в скрытый div, а не используя PHP внутри JS в представлении; 2. Ненавязчивый JS обычно лучше, чем встроенный или встроенный JS B/C. Он многоразовый, более простой в обслуживании и более эффективный. Наконец, плотная связь препятствует гибкости, масштабируемости и поддерживаемости. Приветствие –

+0

Немного почистил. Должен признать, что мой первоначальный комментарий был, вероятно, слишком суровым. Ваша точка очень важна *, но * можно также иметь представление JS и выводить все эти данные, зарегистрированные во всей системе. Также обратите внимание, что вы намекали на MVC, и это всего лишь один шаблон, с которым можно было бы поработать. И, наконец, имея в виду это, мы не знаем, где OP собирается использовать этот код, и, честно говоря, я оставляю все это для него. – Christian

+0

Я согласен на 100%. Привет, сэр! –

Смежные вопросы