Iade php verileri ayrıştırmak nasıl

4 Cevap php

Ben harici bir PHP sunucu beslemesini (gerçek bir bağlantı) erişim ediyorum:

$raw = file_get_contents('http://www.domain.com/getResults.php');

Bu bağlamda aşağıdaki verileri döndürür:

<pre>Array   
(   
    [RequestResult] => Array   
        (   
            [Response] => Success   
            [Value] => 100
            [Name] => Abracadabra
        )   
)   
</pre>

Ama bu yanıtı işlemek için nasıl bilemiyorum ... Ben [Değer] değer ve [Ad] değerini kapmak mümkün olmak istiyorum ama benim PHP becerileri oldukça zayıf ... Ayrıca bir yol olup olmadığını JavaScript (Ben biraz daha iyi JavaScript ile kulüpler) ile bu ele sonra bir istemci tarafı işlevi olarak benim rutin binanın düşünebiliriz ...

Herkes bu yem yanıtı işlemek için bir yol önerebilir?

4 Cevap

Nasıl böyle bir şey

function responseToArray($raw)
{
   $result = array();

  foreach(explode("\n", $raw) as $line)
  {
    $line = trim($line);
    if(stripos($line, " => ") === false)
    {
      continue;
    }
    $toks = explode(' => ', $line);
    $k = str_replace(array('[',']'), "", $toks[0]);
    $result[$k] = $toks[1]; 


  }
  return $result;
}

$ ham [RequestResult] [Değer] çalışmıyor? Ben veri sadece bir iç içe geçmiş karma tablo olduğunu düşünüyorum

Diğer tarafta komut dizisinin bir JSON dize dönebilirsiniz, ve istemci komut kolayca okuyabilirsiniz. json_encode() ve json_decode() bakın. http://www.php.net/json-encode ve http://www.php.net/json-decode

Ne "sunucu" komut yapıyorsun var_dump değişkeni aslında. var_dump aslında veri aktarımı için, bir değişken aslında ne içerdiğini görmek için hata ayıklama için daha fazla kullanılır.

Sunucu senaryo üzerinde:

<?php

header("Content-Type: application/json");
$arr_to_output = array();

// ..  fill up array

echo json_encode($arr_to_output);

?>

Senaryonun çıkışı ['element1', 'element2'] gibi bir şey olurdu.

Istemci komut üzerine:

<?php

$raw = file_get_contents('http://example.com/getData.php');

$arr = json_decode($raw, true); // true to make sure it returns array. else it will return object.

?>

Alternative

Veri yapısı bu şekilde sabit ise, o zaman düzenli ifadeler kullanarak kirli yapmak için deneyebilirsiniz.

Istemci komut üzerine:

<?php

$raw = file_get_contents('http://example.com/getData.php');

$arr = array('RequestResult'=>array());
preg_match('`\[Response\]\s\=\>\s([^\r\n]+)`is',$raw,$m);
$arr['RequestResult']['Response'] = $m[1];
preg_match('`\[Value\]\s\=\>\s([^\r\n]+)`is',$raw,$m);
$arr['RequestResult']['Value'] = $m[1];
preg_match('`\[Name\]\s\=\>\s([^\r\n]+)`is',$raw,$m);
$arr['RequestResult']['Name'] = $m[1];

// $arr is populated as the same structure as the one in the output.

?>

İki olası çözümler:

Solution #1 Change one line at the source:

GetResults.php bir print_r yapıyor gibi görünüyor. O print_r olarak değiştirildi olabilir eğer var_export size beslemek için bir PHP-parseable dize alacağı eval:

$raw = file_get_contents('http://www.domain.com/getResults.php');
$a= eval($raw);
echo($raw['RequestResult']['Value']);

(Sonra dışarı ing ') (echo) harici bir kaynaktan ham veri eval'ing, uyarılmak çok güvenli değil

Solution #2 Parse with a regex:

<?php

$s= <<<EOS
<pre>Array   
(   
    [RequestResult] => Array   
        (   
            [Response] => Success   
            [Value] => 100
            [Name] => Abracadabra
        )   
)   
</pre>
EOS;

if (preg_match_all('/\[(\w+)\]\s+=>\s+(.+)/', $s, $m)) {
 print_r(array_combine($m[1], $m[2]));
}

?>

Ve şimdi $ a içerecektir: $a['Value']==100 ve $a['Name']=='Abracadabra' vb