-1

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

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

是否有可能让它更智能然后在循环中爆炸?

4

7 回答 7

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);
于 2012-09-18T16:29:26.183 回答
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 短数组语法[...]。如果您使用的是 < PHP 5.4,请将其更改为array(...)

于 2012-09-18T17:32:58.260 回答
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
于 2012-09-18T16:01:41.607 回答
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);

哦,这没有什么比这更聪明了……

于 2012-09-18T16:02:09.693 回答
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

你的方式更清晰,更容易理解,所以我会坚持下去。

于 2012-09-18T16:09:36.470 回答
0

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

严格来说仍然循环,但更漂亮:)

于 2012-09-18T16:22:28.067 回答
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++;
 }        
于 2012-09-18T17:28:07.937 回答