web-dev-qa-db-fra.com

convertir le tableau associatif php en objet javascript

J'essaie de charger des mots chinois en tant que clés et leurs traductions en anglais sous forme de valeurs d'une base de données dans un tableau php afin que je puisse les utiliser côté client en JavaScript. Je charge donc les paires PHP key: value dans le tableau JavaScript et j'essaie de produire les résultats sous forme de paire clé-valeur en tant que telle:

stuff : Ni, You 
stuff : Ta, Him or Her
stuff : Wo, I

Les mots chinois et anglais sont chargés dans une base de données relationnelle.

PHP :

$wordsArray = array();               
while ($row = $sql->fetch_assoc()) {
    $wordsArray[$row['chinese']] = $row['english'];
}

Javascript: Ici, je veux que $ .each génère la clé sous forme de chaîne, et non pas un index numérique. Donc quand j'ai essayé var words = [<?php echo '"'.implode('","', $wordsArray).'"' ?>]; comme tableau, j'ai eu:

stuff : 0, You 
stuff : 1, Him or Her
stuff : 2, I

Quand je cherche vraiment:

stuff : Ni, You 
stuff : Ta, Him or Her
stuff : Wo, I

J'ai donc changé words pour être un objet afin que $.each Puisse sortir la clé sous forme de chaîne:

var words = {<?php echo '"'.implode('","', $wordsArray).'"' ?>};
$.each(words, function(key, value) {
    console.log('stuff : ' + key + ", " + value);
});

Ce qui génère une erreur: SyntaxError: Unexpected token ,

18
Growler

Vous pouvez utiliser json_encode () pour créer array comme json object comme,

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

J'ai beaucoup cherché une solution élégante pour résoudre ce problème sans changer les choses sur javascript ou simplement remplacer les guillemets via preg_replace (dans le cas où les valeurs contiendraient des guillemets) et finir par le faire moi-même. même s'il est trop tard, j'espère que cela aiderait ceux qui recherchent la même solution.

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);
}

usage:

$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);

résultat:

{
    someField : "value",
    labelField : "label",
    boolean : false,
    numeric : 5,
    render : {
        option : function() {
            console.log("Hello World!");
            console.log('Hello World!');
        }
    }
}
1
user1968819

La réponse de Rohan Kumar est excellente utilise uniquement jQuery pour afficher ses résultats. Vous pouvez le faire plus facilement et plus petit, voir ci-dessous.

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

Vous donne un résultat d'une ligne (Objet ▶), en cliquant sur le ▶ ouvrira l'objet et affichera son contenu.

1
Harm

Je viens de changer quelques éléments pour le rendre plus compatible (lignes 3 et 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