如何在 PHP 中将字符串拆分为多维数组而不使用循环?
我的字符串格式为
"A,5|B,3|C,8"
array_map
+ explode
的东西应该可以解决问题;例如,考虑到您正在使用 PHP 5.3 :
$str = "A,5|B,3|C,8";
$a = array_map(
function ($substr) {
return explode(',', $substr);
},
explode('|', $str)
);
var_dump($a);
会得到你:
array
0 =>
array
0 => string 'A' (length=1)
1 => string '5' (length=1)
1 =>
array
0 => string 'B' (length=1)
1 => string '3' (length=1)
2 =>
array
0 => string 'C' (length=1)
1 => string '8' (length=1)
当然,这部分代码可以重写以不使用 lambda 函数,并使用 PHP < 5.3 -- but not as fun ^^
尽管如此,我认为
array_map
将循环 explode
返回的数组的每个元素...因此,即使循环不在您的代码中,仍然会有一个...
根本没有循环?做不到。无需编写循环?爆炸或正则表达式“分割”方法之一。
preg_match_all("~([^|,]+),([^|,]+)~", $str, $m);
$result = array_combine($m[1], $m[2]);
这会返回一个类似 array('A' => 5, 'B' => 3 等的数组
取决于 array_walk() 是否算作循环...
<?php
class Splitter {
function __construct($text){
$this->items = array();
array_walk(explode('|', $text), array($this, 'split'));
}
function split($input){
$this->items[] = explode(',', $input);
}
}
$s = new Splitter("A,5|B,3|C,8");
print_r($s->items);
只要您知道每行中有多少个项目,您就可以在一次前瞻中声明一个或多个捕获组。
这“不是循环”,或者至少不是像
foreach()
或 array_map()
这样的循环。 演示
$str = "A,5|B,3|C,8";
preg_match_all(
'/[^,|]+,(?=([^|]+))/',
$str,
$m,
PREG_SET_ORDER
);
var_export($m);
输出:
array (
0 =>
array (
0 => 'A,',
1 => '5',
),
1 =>
array (
0 => 'B,',
1 => '3',
),
2 =>
array (
0 => 'C,',
1 => '8',
),
)
如果您的数据很大,这可能会变得很重,但这里有一个解决方案:
<?php
$data = "A,5|B,3|C,8";
$search = array("|",",");
$replace = array("&","=");
$array = parse_str(str_replace($search, $replace, $data));
?>
会导致这样的结果:
$array = array(
A => 5,
B => 3,
C => 8,
);