如何输出数组以便将其复制粘贴回代码?

时间:2017-10-10 18:50:25

标签: php arrays

如果你想寻求数组的帮助(例如在SO上),你需要发布数组供其他人查看。
问题是没有好的方法来输出数组,以便可以将其复制粘贴回php代码 许多用户只是转储他们的阵列,对于那些想要帮助修复阵列以便可以使用它的人来说,它变得一团糟和/或很难。

如果使用var_dump,结果将为

for i := range items {
    items[i].Status = append(items[i].Status, false)
}

您最终需要删除必须删除的 string(6)等额外字符串。新项目之间缺少逗号。

Print_r解决 string(6)但它仍然缺少逗号,字符串和关联键缺失“”。

有没有什么好方法可以输出你的数组,你可以将粘贴复制到SO?
我自己已经回答了这个问题,但是如果有人有更好的方法或者知道如何让我的代码更好,那么可以随意复制并使用你需要的东西。
我认为我们有一个很好的代码,我们可以让askers使用这些代码来格式化他们的数组,而不是因为版权限制了这个帖子中的答案。
再次,请随意复制我的代码并使其更好,如果可以的话,但对于其他人来说,除非另有说明,否则正常规则适用于其他人。

预期的结果将是一个格式化的数组,您可以将其复制粘贴到PHP代码中,它将直接运行而无需任何添加或删除。

示例数组:

array(4) {
  [0]=>
  array(3) {
    [0]=>
    string(6) "string"
    [1]=>
    int(1)
    ["return"]=>
    bool(true)
  }
  ["two"]=>
  array(3) {
    [0]=>
    string(10) "2017-10-09"
    [1]=>
    float(248.38)
    ["return"]=>
    bool(false)
  }
  [3]=>
  float(-123.4)
  [4]=>
  array(1) {
    [0]=>
    array(2) {
      [0]=>
      string(3) "foo"
      [1]=>
      array(1) {
        [0]=>
        string(3) "bar"
      }
    }
  }
}

2 个答案:

答案 0 :(得分:4)

您正在寻找var_export

var_export($arr);

对于您在问题开头提供的数组,输出:

array (
  0 => 
  array (
    0 => 'string',
    1 => 1,
    'return' => true,
  ),
  'two' => 
  array (
    0 => '2017-10-09',
    1 => 248.38,
    'return' => false,
  ),
  3 => -123.40000000000001,
  4 => 
  array (
    0 => 
    array (
      0 => 'foo',
      1 => 
      array (
        0 => 'bar',
      ),
    ),
  ),
)

请注意已知浮点精度问题后面的次要“毛刺”。

答案 1 :(得分:-1)

这是我能做的最好的事 在我的示例数组中,有一个额外的逗号我似乎无法理解 我有一个回显键和值的函数。它在第一级缩进四个空格,每个级别增加四个空格 我使用str_pad填充空格并循环使用foreach 在此处查看此行动:https://3v4l.org/AOC0L
额外的逗号位于“bar”值之后。

$arr =Array(
    0 => Array
        (
            0 => "string",
            1 => 1,
            "return" => true
        ),

    "two" => Array
        (
            0 => "2017-10-09",
            1 => 248.38,
            "return" => false
        ),
    3 => -123.4,
    4 => array(
            0 => array(
                0 => "foo",
                1 => array(
                    0 => "bar"
                    )
                )
        )
);

输出:

$arr =Array(
    0 => Array
        (
            0 => "string",
            1 => 1,
            "return" => true
        ),

    "two" => Array
        (
            0 => "2017-10-09",
            1 => 248.38,
            "return" => false
        ),
    3 => -123.4,
    4 => array(
            0 => array(
                0 => "foo",
                1 => array(
                    0 => "bar"
                    )
                )
        )
);

echo "<pre>";    
printArray($arr        // Input array for output
           , "array("  // type of output "array()" or "[]". Usage: "array(" or "["
           , 1         // start padding multiplied with 4. 1 = 4 spaces indenting at start.
           , false     // is input a subarray. Always false when you call the function. Only function itself should change this
           );

function printArray($arr, $output, $pad, $subarray){
    // If it's a subarray don't indent "array" text
    if($subarray){
        echo str_pad("", 0, " ") . $output ."<br>\n";
    }else{
        echo str_pad("", $pad*4, " ") . $output ."<br>\n";
    }

    $i=1;
    foreach($arr as $key => $item){
        if(is_array($item)){
            echo str_pad("", ($pad+1)*4, " ");
            // add "" to key if it's associative
            if(is_string($key)){
                echo "\"" . $key. "\" => ";
            }else{
                echo $key . " => ";
            }
            // recrusive run printArray with padding +1 (more indenting)
            printArray($item, $output, $pad+1, true);
        }else{
            echo str_pad("", ($pad+1)*4, " ");

            // add "" to key if it's associative
            if(is_string($key)){
                echo "\"" . $key. "\"";
            }else{
                echo $key;
            }

            // echo item with "" if it's string, or as bool or else as numeric (float/int)
            if(is_string($item)){
                echo " => \"". $item ."\"";
            }else if(is_bool($item)){
                $bool = var_export($item,true);
                echo " => ". $bool;
            }else{
                echo " => ". $item;
            }

            // if it's the last item, don't add comma to end of array
            if($i == count($arr)){
                echo "<br>\n";
            }else{
                echo ",<br>\n";
            }
            $i++;
        }
    }

    // add correct closing bracket
    if($output == "["){
        echo str_pad("", $pad*4, " ") . "]";
    }else{
        echo str_pad("", $pad*4, " ") . ")";
    }

    // if it's the very last item add a ; instead of ,
    if($pad == 1){
        echo ";<br>\n";
    }else{
        if($i == count($arr)){
                echo "<br>\n";
            }else{
                echo ",<br>\n";
            }
    }