Convertir php array a Javascript

185

¿Cómo puedo convertir una matriz PHP en un formato como este?

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
)

a una matriz de Javascript en el formato a continuación?

var cities = [
    "Aberdeen",
    "Ada",
    "Adamsville",
    "Addyston",
    "Adelphi",
    "Adena",
    "Adrian",
    "Akron",
    "Albany"
];
usuario663878
fuente
3
¿Puedes aclarar tu pregunta? ¿Realmente está tratando de crear una matriz de JavaScript, o está tratando de crear una cadena que puede poner en una scriptetiqueta que lo creará, o está tratando de crear JSON para enviar de vuelta en respuesta a una solicitud ajax, o ... (Además, vale la pena revisar el cuadro Cómo formatear en el lado derecho cuando hace su pregunta, y la página vinculada desde [?] Justo arriba del área de preguntas.)
TJ Crowder

Respuestas:

60

La respuesta de Spudley está bien .

Aviso de seguridad: lo siguiente ya no debería ser necesario para usted

Si no tiene PHP 5.2, puede usar algo como esto:

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
fuente
2
acordado: si está utilizando un PHP antiguo, deberá escribir el suyo propio. Sin embargo, también debe considerar actualizar su PHP si es posible.
Spudley
55
Incluso si está utilizando PHP antiguo, no escriba el suyo propio, tome una biblioteca existente que sea mantenida / utilizada por más de una persona / proyecto. Entonces, esta respuesta solo muestra cómo se podría hacer algo, pero no debería recomendar esto, independientemente de la versión de PHP. Por ejemplo, pear.php.net/package/Services_JSON
hakre
Tienes razón. Sin embargo, el código anterior se ha utilizado / probado durante años en dos grandes proyectos.
Udo G
1
Por cierto, se agregó la llamada array_map. Y, sinceramente, no hay necesidad de editar una respuesta perfectamente válida a la pregunta original y marcarla con un "Aviso de seguridad" cuando no incurre en ningún problema de seguridad.
Udo G
1
@UdoG: si no está de acuerdo con una edición, puede volver a editarla usted mismo. hakre dice que sería sensato que alguien que lea esta pregunta use una biblioteca que se sabe que es segura y está bien probada, por ejemplo, de Pear en lugar de simplemente tomar este código por mérito. Además, vale la pena señalar que PHP 5.2 ya no estaba admitido cuando se hizo esta pregunta. Mientras escribo ahora, no ha sido compatible durante dos años y ha conocido problemas de seguridad que no serán reparados. Por lo tanto, es un problema de seguridad simplemente usar PHP 5.2, incluso antes de considerar el código en esta respuesta.
Spudley
439

Asumiré que las dos matrices que ha dado para PHP y JS no están relacionadas, y son solo ejemplos de cómo se ven las matrices en los dos idiomas. Claramente, no podrá convertir esas secuencias de letras y números en los nombres de esas ciudades.

PHP proporciona una función para convertir matrices de PHP en código Javascript: json_encode(). (técnicamente, es formato JSON; JSON significa notación de objetos JavaScript)

Úselo así:

<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>

Consulte también la página del manual que he vinculado anteriormente para obtener más información.

Tenga en cuenta que json_encode()solo está disponible en PHP 5.2 y versiones posteriores, por lo que si está utilizando una versión anterior, deberá utilizar una existente : la página del manual de PHP también incluye comentarios con funciones escritas por personas que la necesitaban. (pero dicho esto, si está utilizando algo anterior a PHP 5.2, debe actualizar lo antes posible)

Spudley
fuente
Te falta un punto y coma al final de la matriz de JavaScript, y esa no es la forma en que se inicializan las matrices de PHP (prueba la matriz ('abc' ...)) ... votar de todos modos porque es probablemente lo que OP quiere
Daniel Sloof
@Spudley Hola, probé esto, y en JavaScript intenté acceder a la matriz creada en php como tal console.log('stuff: ' + javascript_array[0]);, pero dice que javascript_arrayno se ha definido
Growler
Si su matriz PHP contiene caracteres especiales, esto saldrá mal. Puede escapar de caracteres especiales utilizando las funciones urlencode (). Vea mi respuesta: stackoverflow.com/questions/5618925/…
Ben Rogmans
1
Solo para señalar que json_encode define un objeto JavaScript, NO una matriz.
Patrick Moore
1
@PatrickMoore: si va a ser pedante al respecto, json_encodegenera una cadena JSON, que puede representar un objeto JS o una matriz JS, o incluso un solo valor escalar, si eso es lo que pasa. Los ejemplos en mi respuesta generarán una matriz de JavaScript, no un objeto.
Spudley
39

Tonto y simple:

var js_array = [<?php echo '"'.implode('","', $php_array).'"' ?>];
Eric
fuente
66
Solo por curiosidad : ¿qué pasaría cuando la cadena contiene comillas, comillas dobles y / o comas?
Nis
1
Como hay una función para esto, debería preferirse a una solución improvisada a menos que haya una buena razón; no se indica ninguna razón aquí.
cjbarth
funciona mejor para caracteres unicode (urdu en mi caso)
Hammad Khan
33

No tiene que llamar a parseJSON ya que la salida de json_encodees un literal javascript. Simplemente asígnelo a una 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
fuente
23

puedes convertir matrices php en javascript usando la json_encodefunción 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
fuente
3
ese ciclo es terrible
Eric
2
Bueno, eso fue con fines de demostración :)
Dipesh KC
77
@Eric el ejemplo fue tomado directamente como es de la pregunta. Podría haberlo usado, console.log()pero la pregunta en sí es muy básica (y muchos usuarios no tienen experiencia con la herramienta de inspección del código del navegador), así que decidí ir con alert () ya que el usuario lo verá directamente, pero lo sabes muy bien. No es la parte en cuestión de la pregunta, solo una forma de verificar si la lógica funciona o no.
Dipesh KC
17

Creo que la forma más rápida y fácil de trabajar con una matriz PHP en Javascript es hacer esto:

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);?>');
usuario3065931
fuente
10

tan sencillo ...!

usa este método:

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

en laravel blade {{}} usa este método:

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

trabajando para una matriz asociada y no asociada.

اسماعیل زارع
fuente
1
El método que @MohammadKawsara usó funciona mejor para mí, obviamente, si confía en los datos del usuario.
Tomas Crofty
6

también puedes hacerlo de esta manera

<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>
genial Quazi
fuente
6

Es muy simple lo uso de esta manera:

JAVASCRIPT :

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

Convertir matriz PHP a Javascript

¡Saludos!

Radames E. Hernandez
fuente
4

Para una matriz multidimensional en PHP4 puede usar la siguiente adición al código publicado por 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());
Lijadora
fuente
4

Esta es mi funcion. JavaScript debe estar bajo PHP; de lo contrario, use 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 última fila puede ser ... texto (jsArray); y se mostrará "1,2,3,4,5,6"

japetko
fuente
3

Yo uso un falso php array

<?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 alguna vez su matriz es desconocida (ya está hecha)

<?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
fuente
... o podría implosionar () la primera matriz para obtener la "falsa". Sé que esta es una vieja respuesta, pero la idea se me pasó por la cabeza.
Peter Lenjo
1
claro, pero mi camino es la más rápida de todas las sugerencias en esta página. A veces, la velocidad puede ser un factor importante.
Mik
2

Se puede hacer de una manera más segura.

Si su matriz PHP contiene caracteres especiales, debe usar rawurlencode () en PHP y luego usar decodeURIComponent () en JS para escapar de esos. Y analiza el JSON a js nativo. Prueba esto:

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

console.log(data);
Ben Rogmans
fuente
1

Tuve el mismo problema y así es como lo hice.

/*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. 
        }
   });
});

Espero que ayude.

Conceptree
fuente
1

Mantenlo simple :

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

Si necesita una matriz PHP multidimensional para imprimirse directamente en el código fuente de la página html, y en una forma de notación de objetos JavaScript legible por humanos (también conocida como JSON), use esta función agradable que encontré en http://php.net/manual /en/function.json-encode.php#102091 codificado por alguien apodado "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
fuente
Por favor no importa !! Ahora podemos usar esto: json_encode ($ array, JSON_PRETTY_PRINT); ¡y se feliz!
Heitor
0

A continuación se muestra un truco bastante simple para convertir la matriz de PHP a la matriz de JavaScript:

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

JS a continuación:

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

Funciona a las mil maravillas.

Parmar prasante
fuente