Convertir un tableau php en Javascript

185

Comment puis-je convertir un tableau PHP dans un format comme celui-ci

Array
(
    [0] => 001-1234567
    [1] => 1234567
    [2] => 12345678
    [3] => 12345678
    [4] => 12345678
    [5] => AP1W3242
    [6] => AP7X1234
    [7] => AS1234
    [8] => MH9Z2324
    [9] => MX1234
    [10] => TN1A3242
    [11] => ZZ1234
)

à un tableau Javascript au format ci-dessous?

var cities = [
    "Aberdeen",
    "Ada",
    "Adamsville",
    "Addyston",
    "Adelphi",
    "Adena",
    "Adrian",
    "Akron",
    "Albany"
];
user663878
la source
3
Pouvez-vous clarifier votre question? Essayez-vous vraiment de créer un tableau JavaScript, ou essayez-vous de créer une chaîne que vous pouvez mettre dans une scriptbalise qui le créera, ou essayez-vous de créer JSON pour le renvoyer en réponse à une requête ajax, ou ... (Aussi, il vaut la peine de vérifier la boîte Comment mettre en forme sur le côté droit lorsque vous posez votre question, et la page liée à partir du [?] Juste au-dessus de la zone de question.)
TJ Crowder

Réponses:

60

La réponse de Spudley est très bien .

Avis de sécurité: ce qui suit ne devrait plus être nécessaire pour vous

Si vous n'avez pas PHP 5.2, vous pouvez utiliser quelque chose comme ceci:

function js_str($s)
{
    return '"' . addcslashes($s, "\0..\37\"\\") . '"';
}

function js_array($array)
{
    $temp = array_map('js_str', $array);
    return '[' . implode(',', $temp) . ']';
}

echo 'var cities = ', js_array($php_cities_array), ';';
Udo G
la source
2
d'accord: si vous utilisez un ancien PHP, vous devrez écrire le vôtre. Cependant, vous devriez également envisager de mettre à jour votre PHP si possible!
Spudley
5
Même si vous utilisez l'ancien PHP, n'écrivez pas le vôtre, prenez une bibliothèque existante qui est maintenue / utilisée par plus d'une personne / projet. Donc, cette réponse montre seulement comment quelque chose pourrait être fait, mais elle ne devrait pas le recommander - quelle que soit la version de PHP. Par exemple, pear.php.net/package/Services_JSON
hakre
Vous avez raison. Cependant, le code ci-dessus a été utilisé / testé pendant des années dans deux grands projets.
Udo G
1
BTW, vous avez ajouté l'appel array_map. Et, honnêtement, il n'est pas nécessaire de modifier une réponse parfaitement valide à la question d'origine et de la marquer avec un "Avis de sécurité" lorsqu'elle ne présente aucun problème de sécurité.
Udo G
1
@UdoG: si vous n'êtes pas d'accord avec une modification, vous êtes libre de la modifier vous-même. hakre pense qu'il serait judicieux que quelqu'un lisant cette question utilise une bibliothèque connue pour être sécurisée et bien testée, par exemple de Pear plutôt que de prendre ce code simplement sur le mérite. En outre, il convient de souligner que PHP 5.2 était déjà hors de support lorsque cette question a été posée. Au moment où j'écris maintenant, il n'est pas pris en charge depuis deux ans et a connu des problèmes de sécurité qui ne seront pas corrigés. C'est donc un problème de sécurité d'utiliser simplement PHP 5.2, avant même de considérer le code dans cette réponse.
Spudley
439

Je vais supposer que les deux tableaux que vous avez donnés pour PHP et JS ne sont pas liés, et ce ne sont que des exemples de l'apparence des tableaux dans les deux langages. Il est clair que vous ne pourrez pas convertir ces séquences de lettres et de chiffres en ces noms de villes.

PHP fournit une fonction pour convertir des tableaux PHP en code Javascript: json_encode(). (techniquement, c'est le format JSON; JSON signifie JavaScript Object Notation)

Utilisez-le comme ceci:

<script type='text/javascript'>
<?php
$php_array = array('abc','def','ghi');
$js_array = json_encode($php_array);
echo "var javascript_array = ". $js_array . ";\n";
?>
</script>

Voir également la page de manuel que j'ai liée ci-dessus pour plus d'informations.

Notez que ce json_encode()n'est disponible que dans PHP 5.2 et plus, donc si vous utilisez une ancienne version, vous devrez en utiliser une existante - la page de manuel PHP comprend également des commentaires avec des fonctions écrites par les personnes qui en avaient besoin. (mais cela dit, si vous utilisez quelque chose de plus ancien que PHP 5.2, vous devez mettre à jour dès que possible)

Spudley
la source
Il vous manque un point-virgule à la fin du tableau javascript, et ce n'est pas non plus la façon dont les tableaux PHP sont initialisés (essayez array ('abc' ....)) ... de toute façon voter parce que c'est probablement ce que OP veut
Daniel Sloof
@Spudley Salut, j'ai essayé ceci, et dans le javascript j'ai essayé d'accéder au tableau créé en php en tant que tel console.log('stuff: ' + javascript_array[0]);, mais il dit qu'il javascript_arrayn'a pas été défini
Growler
Si votre tableau PHP contient des caractères spéciaux, cela ira mal. Vous pouvez échapper des caractères spéciaux à l'aide des fonctions urlencode (). Voir ma réponse: stackoverflow.com/questions/5618925/…
Ben Rogmans
1
Juste pour souligner que json_encode définit un objet JavaScript, PAS un tableau.
Patrick Moore
1
@PatrickMoore - si vous voulez être pédant à ce sujet, json_encodegénère une chaîne JSON, qui peut représenter un objet JS ou un tableau JS, ou même une seule valeur scalaire, si c'est ce que vous lui transmettez. Les exemples de ma réponse produiront un tableau JavaScript, pas un objet.
Spudley
39

Dumb et simple:

var js_array = [<?php echo '"'.implode('","', $php_array).'"' ?>];
Eric
la source
6
Juste par curiosité : que se passerait-il lorsque la chaîne contenait des guillemets, des guillemets doubles et / ou une virgule?
Nis
1
Puisqu'il y a une fonction pour cela, cela devrait être préféré à une solution improvisée à moins qu'il n'y ait une bonne raison; aucune raison n'est indiquée ici.
cjbarth
fonctionne mieux pour les caractères unicode (urdu dans mon cas)
Hammad Khan
33

Vous n'avez pas besoin d'appeler parseJSON car la sortie de json_encodeest un littéral javascript. Attribuez-le simplement à une variable js.

<script type="text/javascript">
    //Assign php generated json to JavaScript variable
    var tempArray = <?php echo json_encode($php_array); ?>;

   //You will be able to access the properties as 
    alert(tempArray[0].Key);
</script>
Jaykishan
la source
23

vous pouvez convertir des tableaux php en javascript en utilisant la json_encodefonction php

<?php $phpArray = array(
          0 => 001-1234567, 
          1 => 1234567, 
          2 => 12345678, 
          3 => 12345678,
          4 => 12345678,
          5 => 'AP1W3242',
          6 => 'AP7X1234',
          7 => 'AS1234',
          8 => 'MH9Z2324', 
          9 => 'MX1234', 
          10 => 'TN1A3242',
          11 => 'ZZ1234'
    )
?>
<script type="text/javascript">

    var jArray= <?php echo json_encode($phpArray ); ?>;

    for(var i=0;i<12;i++){
        alert(jArray[i]);
    }

 </script>
Dipesh KC
la source
3
cette boucle est terrible
Eric
2
Eh bien, c'était à des fins de démonstration :)
Dipesh KC
7
@Eric l'exemple est directement tiré tel quel de la question. J'aurais pu utiliser console.log()mais la question elle-même est très basique (et beaucoup d'utilisateurs n'ont pas d'expérience avec l'outil d'inspection du code du navigateur), j'ai donc décidé d'utiliser alert () car l'utilisateur le verra directement.Mais vous le savez très bien. n'est pas la partie concernée de la question, juste un moyen de vérifier si la logique fonctionne ou non.
Dipesh KC
17

Je trouve que le moyen le plus rapide et le plus simple de travailler avec un tableau PHP en Javascript est de faire ceci:

PHP:

$php_arr = array('a','b','c','d');

Javascript:

//this gives me a JSON object
js_arr = '<?php echo JSON_encode($php_arr);?>';


//Depending on what I use it for I sometimes parse the json so I can work with a straight forward array:
js_arr = JSON.parse('<?php echo JSON_encode($php_arr);?>');
user3065931
la source
10

si simple ...!

utilisez cette méthode:

<?php echo json_encode($your_array); ?>; 

dans laravel blade {{}} utilisez cette méthode:

{{ str_replace('&quot;', '', json_encode($your_array)) }} 

travaillant pour un tableau associé et non associé.

اسماعیل زارع
la source
1
La méthode utilisée par @MohammadKawsara fonctionne bien évidemment pour moi si vous faites confiance aux données utilisateur.
Tomas Crofty
6

tu peux aussi faire de cette façon

<script>  
    <?php 
        $php_array = array('abc','def','ghi');
        $code_array = json_encode($php_array);
    ?>  
    var array_code = <?php echo $code_array; ?>;
    console.log(array_code);
</script>
cool Quazi
la source
6

Est-ce très simple que j'utilise de cette façon:

JAVASCRIPT :

var arrayJavascript = <?php echo json_encode($arrayPhp) ?>;

Convertir un tableau PHP en Javascript

Cordialement!

Radames E. Hernandez
la source
4

Pour un tableau multidimensionnel en PHP4, vous pouvez utiliser l'ajout suivant au code publié par Udo G:

function js_str($s) {
   return '"'.addcslashes($s, "\0..\37\"\\").'"';
}

function js_array($array, $keys_array) {
  foreach ($array as $key => $value) {
    $new_keys_array = $keys_array;
    $new_keys_array[] = $key;
    if(is_array($value)) {          
      echo 'javascript_array';
      foreach($new_keys_array as $key) {
        echo '["'.$key.'"]';
      }
      echo ' = new Array();';

      js_array($value, $new_keys_array);
    } else {
      echo 'javascript_array';
      foreach($new_keys_array as $key) {
        echo '["'.$key.'"]';
      }
      echo ' = '.js_str($value).";";                        
    }
  } 
}

echo 'var javascript_array = new Array();';
js_array($php_array, array());
Ponceuse
la source
4

C'est ma fonction. JavaScript doit être sous PHP sinon utilisez SESSION.

<?php
 $phpArray=array(1,2,3,4,5,6);
?>

<div id="arrayCon" style="width:300px;"></div>

<script type="text/javascript">
var jsArray = new Array();
<?php
 $numArray=count($phpArray);
 for($i=0;$i<$numArray;$i++){
  echo "jsArray[$i] = ". $phpArray[$i] . ";\n";
 }
?>
$("#arrayCon").text(jsArray[1]);
</script>

La dernière ligne peut être .... text (jsArray); et sera affiché "1,2,3,4,5,6"

japetko
la source
3

J'utilise un faux tableau php

<?php 
       // instead to create your array like this
       $php_array = ["The","quick","brown","fox","jumps","over","the","lazy","dog"];

       // do it like this (a simple variable but with separator)
       $php_fake_array = "The,quick,brown,fox,jumps,over,the,lazy,dog";
?>

<script type="text/javascript">

        // use the same separator for the JS split() function
        js_array = '<?php echo $php_fake_array; ?>'.split(',');

</script>

si jamais votre tableau est inconnu (déjà fait)

<?php 
        $php_array = file('my_file.txt');
        $php_fake_array = "";

        // transform your array with concatenate like this
        foreach ($php_array as $cell){

            // since this array is unknown, use clever separator
            $php_fake_array .= $cell.",,,,,"; 
        }
?>

<script type="text/javascript">

        // use the same separator for the JS split() function
        js_array = '<?php echo $php_fake_array; ?>'.split(',,,,,');

</script>
Mik
la source
... ou vous pouvez imploser () le premier tableau pour obtenir le "faux". Je sais que c'est une vieille réponse, mais l'idée vient de me traverser l'esprit.
Peter Lenjo le
1
bien sûr, mais mon chemin est le plus rapide de toutes les suggestions sur cette page. Parfois, la vitesse peut être un facteur important.
Mik
2

Cela peut être fait de manière plus sûre.

Si votre tableau PHP contient des caractères spéciaux, vous devez utiliser rawurlencode () en PHP, puis utiliser decodeURIComponent () dans JS pour les échapper. Et analysez le JSON en js natif. Essaye ça:

var data = JSON.parse(
        decodeURIComponent(
            "<?=rawurlencode(json_encode($data));?>"
        )
    );

console.log(data);
Ben Rogmans
la source
1

J'ai eu le même problème et c'est ainsi que je l'ai fait.

/*PHP FILE*/

<?php

$data = file_get_contents('http://yourrssdomain.com/rss');
$data = simplexml_load_string($data);

$articles = array();

foreach($data->channel->item as $item){

    $articles[] = array(

        'title' => (string)$item->title,
        'description' => (string)$item ->description,
        'link' => (string)$item ->link, 
        'guid' => (string)$item ->guid,
        'pubdate' => (string)$item ->pubDate,
        'category' => (string)$item ->category,

    );  
}

// IF YOU PRINT_R THE ARTICLES ARRAY YOU WILL GET THE SAME KIND OF ARRAY THAT YOU ARE GETTING SO I CREATE AN OUTPUT STING AND WITH A FOR LOOP I ADD SOME CHARACTERS TO SPLIT LATER WITH JAVASCRIPT

$output="";

for($i = 0; $i < sizeof($articles); $i++){

    //# Items
    //| Attributes 

    if($i != 0) $output.="#"; /// IF NOT THE FIRST

// IF NOT THE FIRST ITEM ADD '#' TO SEPARATE EACH ITEM AND THEN '|' TO SEPARATE EACH ATTRIBUTE OF THE ITEM 

    $output.=$articles[$i]['title']."|";
    $output.=$articles[$i]['description']."|";
    $output.=$articles[$i]['link']."|";
    $output.=$articles[$i]['guid']."|";
    $output.=$articles[$i]['pubdate']."|";
    $output.=$articles[$i]['category'];
}

echo $output;

?>
/* php file */


/*AJAX COMUNICATION*/

$(document).ready(function(e) {

/*AJAX COMUNICATION*/

var prodlist= [];
var attrlist= [];

  $.ajax({  
      type: "get",  
      url: "php/fromupnorthrss.php",  
      data: {feeding: "feedstest"},
      }).done(function(data) {

        prodlist= data.split('#');

        for(var i = 0; i < prodlist.length; i++){

            attrlist= prodlist[i].split('|');

            alert(attrlist[0]); /// NOW I CAN REACH EACH ELEMENT HOW I WANT TO. 
        }
   });
});

J'espère que cela aide.

Conceptree
la source
1

Rester simple :

var jsObject = JSON.parse('<?= addslashes(json_encode($phpArray)) ?>');
Fifi
la source
0

Si vous avez besoin d'un tableau PHP multidimensionnel à imprimer directement dans le code source de la page html, et de manière indentée et lisible par l'homme Javascript Object Notation (aka JSON), utilisez cette fonction intéressante que j'ai trouvée dans http://php.net/manual /en/function.json-encode.php#102091 codé par quelqu'un surnommé "bohwaz".

<?php

function json_readable_encode($in, $indent = 0, $from_array = false)
{
    $_myself = __FUNCTION__;
    $_escape = function ($str)
    {
        return preg_replace("!([\b\t\n\r\f\"\\'])!", "\\\\\\1", $str);
    };

    $out = '';

    foreach ($in as $key=>$value)
    {
        $out .= str_repeat("\t", $indent + 1);
        $out .= "\"".$_escape((string)$key)."\": ";

        if (is_object($value) || is_array($value))
        {
            $out .= "\n";
            $out .= $_myself($value, $indent + 1);
        }
        elseif (is_bool($value))
        {
            $out .= $value ? 'true' : 'false';
        }
        elseif (is_null($value))
        {
            $out .= 'null';
        }
        elseif (is_string($value))
        {
            $out .= "\"" . $_escape($value) ."\"";
        }
        else
        {
            $out .= $value;
        }

        $out .= ",\n";
    }

    if (!empty($out))
    {
        $out = substr($out, 0, -2);
    }

    $out = str_repeat("\t", $indent) . "{\n" . $out;
    $out .= "\n" . str_repeat("\t", $indent) . "}";

    return $out;
}

?>       
Heitor
la source
S'il vous plaît ne faites jamais rien !! Maintenant, nous pouvons simplement utiliser ceci: json_encode ($ array, JSON_PRETTY_PRINT); et soyez heureux!
Heitor
0

Voici une astuce assez simple pour convertir un tableau PHP en tableau JavaScript:

$array = array("one","two","three");

JS ci-dessous:

// Use PHP tags for json_encode()

var js_json =  json_encode($array);
var js_json_string = JSON.stringify(js_json);
var js_json_array = JSON.parse(js_json_string);

alert(js_json_array.length);

Il fonctionne comme un charme.

prashant parmar
la source