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

时间:2012-09-18 15:53:46

标签: 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].',';
   $str2.=$temp2[1].',';        
}

是否可以更智能地进行循环爆炸?

7 个答案:

答案 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++;
 }