php是分割包含成对值的字符串的最佳方法

php是分割包含成对值的字符串的最佳方法,php,string,split,explode,Php,String,Split,Explode,我有一个以下格式的字符串: $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].',';

我有一个以下格式的字符串:

$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].',';        
}

有没有可能比在循环中爆炸更智能呢

最好的方法是组织字符串的格式,这样它就不会进入需要这样做的阶段。但是我假设你做不到,所以把这个问题贴在这里

你所做的是一个很好的方法,除非你想使用正则表达式

$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

哦,这再聪明不过了……

我真的想不出更好的方法了。最好的办法是不要在一开始就需要这样做,但是我们能做什么呢

只是为了提供另一种做同样事情的更好方法,您可以使用

您的方式更清晰、更容易理解,因此我会坚持使用。

假设PHP>=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)

严格地说,仍然是循环的,但更有趣的是:

与公认的答案没有太大区别,但代码更少

<?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);

使用最少代码和无循环的最简单方法可能是使用PHP函数:

// 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,就像我上面所做的那样,进行适当的替换


注意:我使用了PHP5.4短数组语法[…]。如果您使用的是请参阅我的解决方案,以获得一种不用循环、代码更少的方法。这只是我自己的问题,还是这个问题变成了代码高尔夫:
<?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);
 $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++;
 }        
// 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));