我有一个以下格式的字符串:
$str='a1_b1,a2_b2,a3_b3'
其中a和b - 一些正数。我需要拆分它以获得两种格式的字符串:
'a1,a2,a3' and 'b1,b2,b3'
非常原始的方式是:
$temp=explode(',', $str);
$str1='';
$str2='';
for($i=0;$i<count($temp);$i++){
$temp2=explode('_',$temp[$i]);
$str1.=$temp2[0].',';
$str2.=$temp2[1].',';
}
是否可以更智能地进行循环爆炸?
答案 0 :(得分:3)
与接受的答案没有多大差别,但使用更少的代码
<?php
$str = 'a1_b1,a2_b2,a3_b3';
$temp=explode(',', $str);
foreach($temp as $tem)
list($str_a[], $str_b[])=explode('_',$tem);
$str1 = implode(',', $str_a);
$str2 = implode(',', $str_b);
答案 1 :(得分:1)
可能最简单的方法(也恰好使用最少量的代码而没有循环)是利用PHP的parse_str()
函数:
// Assuming $str = 'a1_b1,a2_b2,a3_b3'
$str = str_replace([',', '_'], ['&', '='], $str);
parse_str($str, $arr);
// Your key/value pairs are now in $arr
$keys = implode(',', array_keys($arr));
$values = implode(',', array_values($arr));
当然,parse_str()
需要标准foo=bar&baz=boz
格式,因此如果可能,您应该使用该格式而不是foo_bar,baz_boz
来为自己节省一步。但是,如果那是不可能的,那么你可以像我上面那样使用str_replace()
进行适当的替换。
注意:我使用PHP 5.4短数组语法[...]
。如果你正在使用&lt; PHP 5.4,改为将其更改为array(...)
。
答案 2 :(得分:0)
最好的方法是组织字符串的格式,以便它不会到达您需要执行此操作的阶段。但我假设你不能这样做,因此在这里发布这个问题,
除非您想使用正则表达式,否则您所做的是一种很好的方法。
$str = 'a1_b1,a2_b2,a3_b3' ;
$exp = explode(',', $str);
$a = array();
$b = array();
foreach($exp as $i)
{
$sep = explode('_', $i);
$a[] = $sep[0];
$b[] = $sep[1];
}
// at this point a and b are arrays so if you want to do better things to the data
// you can use arrays instead of manually concatenating the items with commas
$a_str = implode(',', $a); // a1,a2,a2
$b_str = implode(',', $b); // b1,b2,b2
答案 3 :(得分:0)
$temp=explode(',', $str);
$str1='';
$str2='';
$str_a = array();
$str_b = array();
for($i=0;$i<count($temp);$i++){
$temp2=explode('_',$temp[$i]);
$str_a[]=$temp2[0];
$str_b[]=$temp2[1];
}
$str1 = implode(',', $str_a);
$str2 = implode(',', $str_b);
哦,这不是更聪明......
答案 4 :(得分:0)
我无法想到更好的方法。最好的办法是不要在第一时间处理这种情况,但我们能做些什么呢?
只是为了提供另一种(不是更好的)做同样事情的方式,你可以使用strtok
。
$str='a1_b1,a2_b2,a3_b3';
$tok = strtok($str, "_,");
$i = 0;
$a = array();
$b = array();
while ($tok !== false) {
if ($i++ %2) $b[] = $tok;
else $a[] = $tok;
$tok = strtok("_,");
}
echo implode(',', $a); //a1,a2,a3
echo implode(',', $b); //b1,b2,b3
你的方式更清晰,更容易理解,所以我只是坚持下去。
答案 5 :(得分:0)
假设PHP&gt; = 5.3.0:
$str = 'a1_b1,a2_b2,a3_b3';
$array = array_map(function($n) { return explode("_", $n); }, explode(",", $str));
$aString = implode(",", array_map(function($n) { return $n[0]; }, $array));
$bString = implode(",", array_map(function($n) { return $n[1]; }, $array));
var_dump($aString);
var_dump($bString);
输出:
string 'a1,a2,a3' (length=8)
string 'b1,b2,b3' (length=8)
严格来说仍然是循环,但发烧友:)
答案 6 :(得分:0)
$str = 'a1_b1,a2_b2,a3_b3' ;
$arr = preg_split("/[\s,_]/" , $str);
$str1 = $str2 = '';
for($i=0; $i<count($arr); $i++) {
$str1 .= $arr[$i] ;
if(isset($arr[$i+1]))
$str2 .= $arr[$i+1];
if(isset($arr[$i+2])) {
$str1 .= ',';
$str2 .= ',';
}
$i++;
}