-1

次の形式の文字列があります。

$str='a1_b1,a2_b2,a3_b3' 

どこで a と b - いくつかの正の数。2 つの文字列を形式で取得するには、分割する必要があります。

'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()上記のように使用して適切な置換を行うことができます。

注: PHP5.4の短い配列構文を使用し[...]ました。<PHP 5.4を使用している場合は、array(...)代わりにに変更してください。

于 2012-09-18T17:32:58.260 に答える
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 に答える
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
$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

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' ;
$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 に答える