Converter array php em Javascript

185

Como posso converter uma matriz PHP em um 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
)

para uma matriz Javascript no formato abaixo?

var cities = [
    "Aberdeen",
    "Ada",
    "Adamsville",
    "Addyston",
    "Adelphi",
    "Adena",
    "Adrian",
    "Akron",
    "Albany"
];
user663878
fonte
3
Você pode esclarecer sua pergunta? Você está realmente tentando criar uma matriz JavaScript, ou está tentando criar uma string que pode colocar em uma scripttag que a criará, ou está tentando criar JSON para enviar de volta em resposta a uma solicitação ajax, ou ... (Além disso, vale a pena conferir o como formatar caixa no lado direito quando você está pedindo a sua pergunta, e a página vinculada a partir da [?] logo acima da área a questão.)
TJ Crowder

Respostas:

60

A resposta de Spudley está bem .

Aviso de segurança: O seguinte não deve ser mais necessário para você

Se você não possui o PHP 5.2, pode usar algo como isto:

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
fonte
2
concordou: se você estiver usando um PHP antigo, precisará escrever o seu. No entanto, você também deve considerar atualizar seu PHP, se possível!
Spudley
5
Mesmo se você estiver usando PHP antigo, não escreva seu próprio, pegue uma biblioteca existente que seja mantida / usada por mais de uma pessoa / projeto. Portanto, essa resposta mostra apenas como algo pode ser feito, mas não deve ser recomendado - independentemente da versão do PHP. Exemplo: pear.php.net/package/Services_JSON
hakre
Você está certo. No entanto, o código acima foi usado / testado por anos em dois grandes projetos.
Udo L
1
BTW, você adicionou a chamada array_map. E, honestamente, não há necessidade de editar uma resposta perfeitamente válida para a pergunta original e marcá-la com um "Aviso de segurança" quando não ocorrer nenhum problema de segurança.
precisa
1
@UdoG: se você não concordar com uma edição, poderá editá-la novamente. O hakre tem o argumento de que seria sensato alguém ler essa pergunta usar uma biblioteca que era conhecida por ser segura e bem testada, por exemplo, da Pear, em vez de apenas levar esse código por mérito. Além disso, vale ressaltar que o PHP 5.2 já estava sem suporte quando essa pergunta foi feita. Enquanto escrevo agora, ele não é suportado há dois anos e tem problemas de segurança que não serão corrigidos. Portanto, é uma questão de segurança simplesmente usar o PHP 5.2, antes mesmo de considerarmos o código nesta resposta.
Spudley
439

Vou assumir que as duas matrizes que você forneceu para PHP e JS não estão relacionadas, e são apenas exemplos de como as matrizes ficam nas duas linguagens. Claramente, você não poderá converter essas seqüências de letras e números nesses nomes de cidades.

PHP fornece uma função para converter matrizes PHP em código Javascript: json_encode(). (tecnicamente, é o formato JSON; JSON significa JavaScript Object Notation)

Use-o assim:

<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 também a página do manual que eu vinculei acima para obter mais informações.

Observe que ele json_encode()está disponível apenas no PHP 5.2 e superior; portanto, se você estiver usando uma versão mais antiga, precisará usar uma já existente - a página de manual do PHP também inclui comentários com funções escritas por pessoas que precisam dela. (mas dito isso, se você estiver usando algo mais antigo que o PHP 5.2, atualize o mais rápido possível)

Spudley
fonte
Está faltando um ponto-e-vírgula no final da matriz javascript, e também não é assim que as matrizes PHP são inicializadas (tente matriz ('abc' ....)) ... faça o upvote de qualquer maneira porque provavelmente é o que o OP quer
Daniel Sloof
@Spudley Oi, eu tentei isso e, no javascript tentou aceder a matriz criado em php como tal console.log('stuff: ' + javascript_array[0]);, mas ele diz que javascript_arraynão foi definido
Growler
Se sua matriz PHP contiver caracteres especiais, isso dará errado. Você pode escapar de caracteres especiais usando as funções urlencode (). Veja minha resposta: stackoverflow.com/questions/5618925/…
Ben Rogmans
1
Apenas para salientar que json_encode define um objeto JavaScript, NÃO uma matriz.
Patrick Moore
1
@PatrickMoore - se você for pedante sobre isso, json_encodegera uma string JSON, que pode representar um objeto JS ou uma matriz JS, ou mesmo um único valor escalar, se é isso que você passa. Os exemplos na minha resposta produzirão uma matriz JavaScript, não um objeto.
Spudley
39

Burro e simples:

var js_array = [<?php echo '"'.implode('","', $php_array).'"' ?>];
Eric
fonte
6
Apenas por curiosidade : o que aconteceria quando a string contivesse aspas, aspas duplas e / ou vírgula?
Nis
1
Como existe uma função para isso, isso deve ser preferido em relação a uma solução improvisada, a menos que haja uma boa razão; nenhuma razão é aqui declarada.
Cjbarth 31/07/2014
funciona melhor para caracteres Unicode (urdu no meu caso)
Hammad Khan
33

Você não precisa chamar parseJSON, pois a saída de json_encodeé um literal javascript. Apenas atribua a uma variável 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
fonte
23

você pode converter matrizes php em javascript usando a json_encodefunção 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
fonte
3
esse ciclo é terrível
Eric
2
Bem, isso era para fins de demonstração :)
Dipesh KC
7
@ Eric, o exemplo foi tirado diretamente , pois é da pergunta. Eu poderia ter usado, console.log()mas a pergunta em si é muito básica (e muitos usuários não têm experiência com a ferramenta de inspeção de código do navegador), então decidi usar o alert (), pois o usuário a verá diretamente. não é a parte em questão da questão, apenas uma maneira de verificar se a lógica funciona ou não.
Dipesh KC
17

Acho que a maneira mais rápida e fácil de trabalhar com uma matriz PHP em Javascript é fazer isso:

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

tão simples ...!

use este método:

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

no laravel blade {{}} use este método:

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

trabalhando para matriz associada e não associada.

اسماعیل زارع
fonte
1
O método @MohammadKawsara usado funciona melhor para mim, obviamente, se você confiar nos dados do usuário.
Tomas Crofty
6

você também pode fazer dessa maneira

<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>
Quazi legal
fonte
6

É muito simples eu uso desta maneira:

JAVASCRIPT :

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

Converter array PHP em Javascript

Saudações!

Radames E. Hernandez
fonte
4

Para uma matriz multidimensional no PHP4, você pode usar a seguinte adição ao código postado pelo 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());
Sander
fonte
4

Esta é a minha função. O JavaScript deve estar no PHP, caso contrário, 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>

A última linha pode ser .... text (jsArray); e será mostrado "1,2,3,4,5,6"

japetko
fonte
3

Eu uso um array php falso

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

se alguma vez sua matriz for desconhecida (já criada)

<?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
fonte
... ou você pode implodir () a primeira matriz para obter a "falsa". Sei que essa é uma resposta antiga, mas a ideia passou pela minha cabeça.
Peter Lenjo 26/01
1
com certeza, mas meu caminho é o mais rápido de todas as sugestões desta página. Às vezes, a velocidade pode ser um fator importante.
Mik 31/01
2

Isso pode ser feito de maneira mais segura.

Se sua matriz PHP contiver caracteres especiais, você precisará usar rawurlencode () no PHP e, em seguida, usar decodeURIComponent () em JS para escapar deles. E analise o JSON para js nativos. Tente o seguinte:

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

console.log(data);
Ben Rogmans
fonte
1

Eu tive o mesmo problema e foi assim que o fiz.

/*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 ajude.

Conceptree
fonte
1

Mantenha simples :

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

Se você precisar que uma matriz PHP multidimensional seja impressa diretamente no código-fonte da página html, e de maneira recortada por Notação de Objeto Javascript legível por humanos (também conhecida como JSON), use esta boa função que encontrei em http://php.net/manual /en/function.json-encode.php#102091 codificado por alguém apelidado de "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
fonte
Por favor deixa pra lá !! Agora podemos apenas usar isso: json_encode ($ array, JSON_PRETTY_PRINT); e seja feliz!
Heitor
0

Abaixo está um truque bastante simples para converter a matriz PHP em matriz JavaScript:

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

JS abaixo:

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

Ele funciona como um encanto.

prashant parmar
fonte