如何正确格式化数组?

时间:2018-07-18 02:55:01

标签: php

此代码正常工作:

$message = json_encode(array('jsonrpc' => '2.0', 'id' => 1, 'method' => 'getExchangeAmount', 'params' => array(array('from' => 'BTC', 'to' => 'ETH', 'amount' => '1'),array('from' => 'BTC', 'to' => 'ETC', 'amount' => '1'))));

但是我试图将其更改为此,但它不起作用:

$exchange_pairs = file_get_contents('exchange_pairs.txt', true);
$message = json_encode(array('jsonrpc' => '2.0', 'id' => 1, 'method' => 'getExchangeAmount', 'params' => array($exchange_pairs)));

这是exchange_pairs.txt文件中的内容:

array('from' => 'BTC', 'to' => 'ETH', 'amount' => '1'),array('from' => 'BTC', 'to' => 'ETC', 'amount' => '1')

这不是我的选择,我必须从文件中获取此数据。我知道这很不方便。

我猜这行是无效的,但是不知道为什么或需要更改为什么?

'params' => array($exchange_pairs)

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您正在使用file_get_contents()获取 text (.txt)文件的 text 内容。您可以像在这里一样将这些内容放入变量中(在本例中为$ exhange_pairs),但是PHP仍然只会将该内容视为字符串。不作为一系列数组。更糟的是,您正在使用的文本文件似乎将“代码”塞入了CSV格式。但是您不能简单地将“,”上的值分开,因为文件的其余部分也包含逗号。

发生的事情是PHP正在读取您的语句,如下所示:

'params' => array("A STRING VALUE!")

首先,请记住,这是尝试从另一个文件获取数组值的可怕方法。如果您只是想从该 text 文件中获取值并以PHP 数组的形式读取它们,则需要解析这些字符串内容和/或 eval 这些内容。 (请不要这样做-但是您正在描述的当前设置看起来似乎是一种必要的方法。)

正确方法是将文件中的数据转换为标准文件格式(JSON,CSV等),因此在读取文本文件后可以有效地将其解析为变量。但是,如果这根本不是一种选择,那么这是一种使其工作的方法(非常难看):

<?php
    declare(strict_types=1);
    $fileContents = "array('from' => 'BTC', 'to' => 'ETH', 'amount' => '1'),array('from' => 'BTC', 'to' => 'ETC', 'amount' => '1')";
    $paramsArray = [];
    $arrayPieces = explode('),', $fileContents);
    foreach ($arrayPieces as $index => $arrayString) {
        if ($index !== count($arrayPieces) - 1) {
            $arrayString .= ')';
        }
        $arrayString = '$paramsArray[] = ' . $arrayString . ';';
        eval($arrayString);
    }
    var_dump($paramsArray);
?>

答案 1 :(得分:0)

关于此的另一条注释:如果您仅必须以上面说明的格式使用数据,则忽略该数据“看起来”像PHP这样的事实会更安全。代码(例如,它正在尝试为您定义数组),并将其简单地视为文本解析操作。如果通过值解析方式,将使您不必使用eval(),因为对从脚本外某个文件使用的文本使用eval()极其危险。这是一种纯粹作为文本分析操作的方法:

<?php
   declare(strict_types=1);
   $fileContents = "array('from' => 'BTC', 'to' => 'ETH', 'amount' => '1'),array('from' => 'BTC', 'to' => 'ETC', 'amount' => '1')";
   $paramsArray = [];
   $fileContents = str_replace("'", '', $fileContents);
   $fileContents = str_replace('array', '', $fileContents);
   $fileContents = str_replace(' ', '', $fileContents);
   $arrays = explode('),(', $fileContents);
   foreach ($arrays as $arrayIndex => $array) {
      $array = str_replace(')', '', $array);
      $array = str_replace('(', '', $array);
      $subArray = [];
      $keyValuePairs = explode(',', $array);
      foreach ($keyValuePairs as $keyValuePairIndex => $keyValuePair) {
         $keyAndValue = explode('=>', $keyValuePair);
         $subArray[$keyAndValue[0]] = $keyAndValue[1];
      }
      $paramsArray[] = $subArray;
   }
   var_dump($paramsArray);
?>