2016-02-05 51 views
0

我有一個數組稱爲$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)); 

但我正在尋找一個更優化的解決方案,任何建議?

+0

你的子陣列都嚴格年例如如何?他們都有2個元素,每個都有'name'和'username'作爲鍵? – fusion3k

+0

@ fusion3k,在這個例子中只有兩個元素,但將來我可以添加更多的鍵。 –

回答

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

你可以用你首選底線性格改變$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頁面

+0

我編輯你的代碼是這樣的:http://pastebin.com/DGBGDunj你如何看到結果也返回數組在第一個位置我怎麼能解決這個問題?謝謝 –

+0

如果我插入'$ output [] ='我只有'array'沒有返回內容。你還需要修正數組聲明是'$ output = array()'而不是'$ output = array []'; –

+1

@SevengamesXoom新增工作函數示例。你的pastebin不起作用,因爲你把'output'聲明爲數組,然後你把它當作字符串。是的,固定數組聲明,謝謝! – fusion3k

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) 
+0

我只需要一個功能就可以做到這一點 –

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' 
)