如何在没有循环的情况下将字符串拆分为PHP中的多维数组?
我的字符串格式为"A,5|B,3|C,8"
答案 0 :(得分:7)
如果没有你实际上正在执行循环部分,那么基于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 - 但没有那么有趣^^
不过,我认为array_map
将遍历explode
返回的数组的每个元素...所以,即使循环不在你的代码中,仍然会有一个...
答案 1 :(得分:3)
根本没有循环?无法做到。没有你必须编写循环?爆炸或正则表达式“拆分”方法之一。
答案 2 :(得分:2)
preg_match_all("~([^|,]+),([^|,]+)~", $str, $m);
$result = array_combine($m[1], $m[2]);
这将返回一个类似数组的数组('A'=> 5,'B'=> 3等
答案 3 :(得分:0)
你可以使用map和explode的组合,但是你并没有真正避免循环,你只是不使用for / while语句。
答案 4 :(得分:0)
如果您的数据很大,这可能会变得很重,但这是一个解决方案:
<?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,
);
答案 5 :(得分:0)
取决于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);
答案 6 :(得分:-2)
小循环最好。
$array1 = split('|',$data);
$final=array();
$foreach($array1 as $arraypart) {
$part = split(',',$arraypart);
$final[$part[0]] = $part[1];
}