Конвертировать php-ассоциативный массив в объект javascript
Я пытаюсь загрузить китайские слова в виде ключей, а их переводы на английском языке как значения из базы данных в php-массив, поэтому я могу использовать их на стороне клиента в JavaScript. Поэтому я загружаю пары PHP: значение в массив JavaScript и пытаюсь вывести результаты как пару значений ключа как таковую:
stuff : Ni, You
stuff : Ta, Him or Her
stuff : Wo, I
Слова китайского и английского языков загружаются в реляционную базу данных.
PHP
$wordsArray = array();
while ($row = $sql->fetch_assoc()) {
$wordsArray[$row['chinese']] = $row['english'];
}
Javascript. Здесь я хочу, чтобы $.each выводил ключ как строку, а не индекс числа. Поэтому, когда я пробовал var words = [<?php echo '"'.implode('","', $wordsArray).'"' ?>];
как массив, я получил:
stuff : 0, You
stuff : 1, Him or Her
stuff : 2, I
Когда я действительно ищу:
stuff : Ni, You
stuff : Ta, Him or Her
stuff : Wo, I
Итак, я изменил words
как объект, чтобы $.each
мог выводить ключ как строку:
var words = {<?php echo '"'.implode('","', $wordsArray).'"' ?>};
$.each(words, function(key, value) {
console.log('stuff : ' + key + ", " + value);
});
Что вызывает ошибку: SyntaxError: Unexpected token ,
Ответы
Ответ 1
Вы можете использовать json_encode(), чтобы сделать array
как json object
как,
var words = <?php echo json_encode($wordsArray) ?>;// don't use quotes
$.each(words, function(key, value) {
console.log('stuff : ' + key + ", " + value);
});
Ответ 2
Я много искал для элегантного решения, чтобы исправить эту проблему, не изменяя вещи по javascript или просто заменяя кавычки через preg_replace (для случая, когда значения будут содержать кавычки), и в конечном итоге сделайте это самостоятельно. даже если это слишком поздно, я надеюсь, что это поможет тем, кто ищет то же решение.
function json_encode_advanced(array $arr, $sequential_keys = false, $quotes = false, $beautiful_json = false) {
$output = "{";
$count = 0;
foreach ($arr as $key => $value) {
if ( isAssoc($arr) || (!isAssoc($arr) && $sequential_keys == true ) ) {
$output .= ($quotes ? '"' : '') . $key . ($quotes ? '"' : '') . ' : ';
}
if (is_array($value)) {
$output .= json_encode_advanced($value, $sequential_keys, $quotes, $beautiful_json);
} else if (is_bool($value)) {
$output .= ($value ? 'true' : 'false');
} else if (is_numeric($value)) {
$output .= $value;
} else {
$output .= ($quotes || $beautiful_json ? '"' : '') . $value . ($quotes || $beautiful_json ? '"' : '');
}
if (++$count < count($arr)) {
$output .= ', ';
}
}
$output .= "}";
return $output;
}
function isAssoc(array $arr) {
if (array() === $arr) return false;
return array_keys($arr) !== range(0, count($arr) - 1);
}
использование:
$array = [
'someField' => '"value"', // double quotes for string if needed
'labelField' => '"label"', // double quotes for string if needed
'boolean' => false,
'numeric' => 5,
'render' => [
'option' => 'function() {
console.log("Hello World!");
console.log(\'Hello World!\');
}',
],
];
echo json_encode_advanced($array);
результат:
{
someField : "value",
labelField : "label",
boolean : false,
numeric : 5,
render : {
option : function() {
console.log("Hello World!");
console.log('Hello World!');
}
}
}
Ответ 3
Я только что изменил несколько вещей, чтобы сделать его более совместимым (строки 3 и 29):
function json_encode_advanced(array $arr, $sequential_keys = false, $quotes = false, $beautiful_json = false) {
$output = isAssoc($arr) ? "{" : "[";
$count = 0;
foreach ($arr as $key => $value) {
if (isAssoc($arr) || (!isAssoc($arr) && $sequential_keys == true )) {
$output .= ($quotes ? '"' : '') . $key . ($quotes ? '"' : '') . ' : ';
}
if (is_array($value)) {
$output .= json_encode_advanced($value, $sequential_keys, $quotes, $beautiful_json);
}
else if (is_bool($value)) {
$output .= ($value ? 'true' : 'false');
}
else if (is_numeric($value)) {
$output .= $value;
}
else {
$output .= ($quotes || $beautiful_json ? '"' : '') . $value . ($quotes || $beautiful_json ? '"' : '');
}
if (++$count < count($arr)) {
$output .= ', ';
}
}
$output .= isAssoc($arr) ? "}" : "]";
return $output;
}