在自定义字符串布局中转换数组索引?

时间:2016-02-05 12:42:11

标签: php

我有一个名为$context的数组,具有以下结构:

array(2) {
[0]=>
 array(2) {
  ["name"]=>
  string(6) "Foo"
  ["username"]=>
  string(6) "Test"
}
[1]=>
array(2) {
["name"]=>
string(4) "John"
["username"]=>
string(3) "Doe"
 }
}

我想将其转换为此字符串:

字符串1:

0: array(
   'name' => 'Foo',
   'username' => 'Test',
)

字符串2:

1: array(
   'name' => 'John',
   'username' => 'Doe',
) 

如何看待我想要在迭代中保存当前索引,并在一行中显示格式为'name''username'的数组内容。我已经尝试过这段代码:

    $export = '';

    foreach($context as $key => $value)
    {
        $export .= "{$key}: ";
        print_r($value);
        $export .= preg_replace(array(
            '/=>\s+([a-zA-Z])/im',
            '/array\(\s+\)/im',
            '/^  |\G  /m'
        ), array(
            '=> $1',
            'array()',
            '    '
        ), str_replace('array (', 'array(', var_export($value, true)));

        print_r($export);

        $export .= PHP_EOL;
    }

    return str_replace(array('\\\\', '\\\''), array('\\', '\''), rtrim($export));

但我正在寻找更优化的解决方案,任何建议?

3 个答案:

答案 0 :(得分:1)

这是我的代码:

$context = [['name'=>'Foo','username'=>'Test'],['name'=>'John','username'=>'Doe']];
$schema = "   '%s' => '%s'";
$lineBreak = PHP_EOL;

foreach( $context as $idx => $array )
{
    $lines = array();
    foreach( $array as $key => $val )
    {
        $lines[] = sprintf( $schema, $key, $val );
    }
    $output = "{$idx}: array({$lineBreak}".implode( ",{$lineBreak}", $lines )."{$lineBreak})";
    echo $output.$lineBreak;
}

eval.in demo

它将独立于子阵列中的元素数量

我使用了经典的内置函数sprintf来格式化每个数组行:see more

您可以使用首选的endLine字符更改$lineBreak; 在上面的例子中,每个字符串都被打印出来,但是(你的函数中有一个return,所以我认为在函数内部)你可以这样修改:

$output = array();
foreach( $context as $idx => $array )
{
    (...)
    $output[] = "{$idx}: array({$lineBreak}".implode( ",{$lineBreak}", $lines )."{$lineBreak})";
}

让数组填充格式化的字符串。

您可以在函数中轻松转换它:

function contextToString( $context, $schema=Null, $lineBreak=PHP_EOL )
{
    if( !$schema ) $schema = "   '%s' => '%s'";
    $output = array();

    foreach( $context as $idx => $array )
    {
        $lines = array();
        foreach( $array as $key => $val )
        {
            $lines[] = sprintf( $schema, $key, $val );
        }
        $output[] = "{$idx}: array({$lineBreak}".implode( ",{$lineBreak}", $lines )."{$lineBreak})";
    }

    return implode( $lineBreak, $output );
}

eval.in demo

每次更改架构和换行符时都会更改。

PS:我在你的代码中看到,在eache数组的最后一个元素的末尾也有一个逗号;认为这是一个错字,我省略了它

编辑:我已经忘记了逗号,添加了它 编辑2:添加完整的功能示例 编辑3:添加了sprintf PHP页面

的链接

答案 1 :(得分:0)

尝试使用personnal toString

$a = array(array("name"=>"Foo", "username"=>"Test"), array("name"=>"John", "username"=>"Doe"));

function toString($array){
    $s = ""; $i=0;
    foreach ($array as $key => $value) {
        $s.= $key."=>".$value;
        if($i < count($array)-1)
            $s.=",";
        $i++;
    }
    return $s;
}
$result = array();
$index = 0;

foreach ($a as $value) {
    array_push($result, $index. " : array(" . toString($value).")");
    $index ++;
}

var_dump($result);

结果:

array (size=2)
  0 => string '0 : array(name=>Foo,username=>Test)' (length=35)
  1 => string '1 : array(name=>John,username=>Doe)' (length=35)

结果是在数组中,但您可以更改并制作您想要的内容

但你也可以使用json_encode:

$result = array();
$index = 0;

foreach ($a as $value) {
    array_push($result, $index. " : array(" . json_encode($value).")");
    $index ++;
}

var_dump($result);

结果如下:

array (size=2)
 0 => string '0 : array({"name":"Foo","username":"Test"})' (length=43)
 1 => string '1 : array({"name":"John","username":"Doe"})' (length=43)

答案 2 :(得分:0)

使用strrpossubstr_replacevar_export的简化解决方案:

$arr = [
    array(
    'name' => 'John',
    'username' => 'Doe'
    ),
    array(
    'name' => 'Mike',
    'username' => 'Tyson'
    )
];

/*****************/
$strings = [];
foreach($arr as $k => $v){
    $dump = var_export($v, true);
    $last_comma_pos = strrpos($dump,",");
    $cleared_value = substr_replace($dump, "", $last_comma_pos, 1);
    $strings[] = $k.": ".$cleared_value;
}
/*****************/

// Now $strings variable contains all the needed strings
echo "<pre>";
foreach($strings as $str){
    echo $str . "\n";
}

// the output:
0: array (
  'name' => 'John',
  'username' => 'Doe'
)
1: array (
  'name' => 'Mike',
  'username' => 'Tyson'
)