web-dev-qa-db-ja.com

PHP連想配列をJavaScriptオブジェクトに変換します

私は中国語の単語をキーとしてロードし、英語の翻訳をデータベースからPHP配列に値としてロードしようとしているので、JavaScriptでクライアント側で使用できます。そこで、PHP key:valueのペアを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 ,_

18
Growler

json_encode() を使用して、arrayjson objectのように作成できます。

var words = <?php echo json_encode($wordsArray) ?>;// don't use quotes
$.each(words, function(key, value) {
    console.log('stuff : ' + key + ", " + value);
});
42
Rohan Kumar

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!');
        }
    }
}
1
user1968819

Rohan Kumarの答えは、jQueryを使用して結果を表示するだけです。あなたはそれをより簡単に、より小さくすることができます、以下を見てください。

var words = <?php echo json_encode( $wordsArray ) ?>;
console.dir(words);

1行の結果(オブジェクト▶)が表示され、▶をクリックするとオブジェクトが開き、その内容が表示されます。

1
Harm

互換性を高めるためにいくつかの点を変更しました(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;
}
0
FredP