【问题标题】:print an array as code将数组打印为代码
【发布时间】:2011-07-05 14:35:57
【问题描述】:

我想将一个大的 yaml 文件转换为 PHP 数组源代码。我可以读入 yaml 代码并取回一个 PHP 数组,但是使用 var_dump($array) 我会得到伪代码作为输出。我想将数组打印为有效的 php 代码,这样我就可以将它复制粘贴到我的项目中并放弃 yaml。

【问题讨论】:

  • 出于好奇,您为什么要放弃 yaml?这是您和其他人可以手动编辑的绝妙格式。 :-)
  • 如果您将它与“包含”一个 php 数组进行比较,那么在每个请求上解析一个 YAML 文件相对较慢。在我目前的项目中,速度更重要。

标签: php yaml


【解决方案1】:

您正在寻找var_export

【讨论】:

  • 即:$string_representation = var_export($complex_array, TRUE);
  • 有没有办法用 [] 而不是 array() 来 var_export ?
  • 我不知道。
  • 耶!这个问题我想了很久。 @Oliboy50 只需在 array ( -> [, ) -> , ] 上查找+替换即可
  • @RobbertvandenBogerd 如果在数组中的字符串中包含单词“array(”,或者只是“)”,您会得到令人惊讶的结果……
【解决方案2】:

您可以使用var_exportserialize(在保留端使用反序列化),甚至可以使用json_encode(并在接收端使用json_decode)。最后一个的优点是产生的输出可以被任何可以处理 JSON 的东西处理。

【讨论】:

    【解决方案3】:

    不知道为什么,但我在任何地方都找不到令人满意的代码。

    很快就写好了。如果您发现任何错误,请告诉我。

      function printCode($array, $path=false, $top=true) {
        $data = "";
        $delimiter = "~~|~~";
        $p = null;
        if(is_array($array)){
          foreach($array as $key => $a){
            if(!is_array($a) || empty($a)){
              if(is_array($a)){
                $data .= $path."['{$key}'] = array();".$delimiter;
              } else {
                $data .= $path."['{$key}'] = \"".htmlentities(addslashes($a))."\";".$delimiter;
              }
            } else {
              $data .= printCode($a, $path."['{$key}']", false);
            }    
          }
        }
    
        if($top){
          $return = "";
          foreach(explode($delimiter, $data) as $value){
            if(!empty($value)){
              $return .= '$array'.$value."<br>";
            }
          };
          return $return;
        }
    
        return $data;
      }
    
      //REQUEST
      $x = array('key'=>'value', 'key2'=>array('key3'=>'value2', 'key4'=>'value3', 'key5'=>array()));
      echo printCode($x);
    
      //OUTPUT
      $array['key'] = 'value';
      $array['key2']['key3'] = 'value2';
      $array['key2']['key4'] = 'value3';
      $array['key2']['key5'] = array();
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案4】:

      另一种将数组显示为带有缩进的代码的方法。

      仅使用包含字符串、整数和数组的数组进行测试。

      
      function bo_print_nice_array($array){
          echo '$array=';
          bo_print_nice_array_content($array, 1);
          echo ';';
      }
      function bo_print_nice_array_content($array, $deep=1){
          $indent = '';
          $indent_close = '';
          echo "[";
          for($i=0; $i<$deep; $i++){
              $indent.='&nbsp;&nbsp;&nbsp;&nbsp;';
          }
          for($i=1; $i<$deep; $i++){
              $indent_close.='&nbsp;&nbsp;&nbsp;&nbsp;';
          }
          foreach($array as $key=>$value){
              echo "<br>".$indent;
              echo '"'.$key.'" => ';
              if(is_string($value)){
                  echo '"'.$value.'"';
              }elseif(is_array($value)){
                  bo_print_nice_array_content($value, ($deep+1));
              }else{
                  echo $value;
              }
              echo ',';
          }
          echo '<br>'.$indent_close.']';
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        • 2022-12-18
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多