2016-07-18 8 views
3

与えられた文字列から数字を配列として取得する必要があります。文字列から特定のコンテンツを取得する

例文字列:

$t = '1-P,2-T,3-P,4-R,5-C,6-T,'; 

予想される出力:

  • 私は-Tを検索した場合、出力は次のようにする必要があります:それは-Pだ場合
 
array(
    [0] => 2, 
    [1] => 6 
) 
 
array(
    [0] => 1, 
    [1] => 3 
) 

は私がvar_export(explode("-T,",$t));を試みたが、期待どおりに動作しませんでした。 誰でも私にこれを得るための提案を与えることができますか?

+1

なぜそれが唯一のため3' '返します:あなたは、あなたがしたい方の文字で繰り返し検索を行うことができるように

以下のコードは、数字の配列に連想配列マッピング文字にデータを変換し、 'P'でもなく' 1'でもない?結局のところ、あなたは '3-P'と' 1-P'の両方を持っています – FirstOne

+1

私はただのマニアックスを待っていますxD – FirstOne

答えて

4

以下検索用語-Pをpreceeds完全整数と一致。
のは、簡潔にそれを維持してみましょう:

$matches = array(); 
if (preg_match_all('/([0-9]+)\-P/', $t, $matches) >= 1) { 
    var_dump($matches[1]); 
} 

検索'/([0-9]+)\-T/'/([0-9]+)\-C/、​​ためのように。


異なる検索用語/フィルターを探すために、より動的な方法:

$filter = '-T'; 
$pattern = sprintf('/([0-9]+)%s/', preg_quote($filter)); 

preg_match_allpreg_quote機能を参照してください。

+0

このソリューションは、長さが1より大きい数値も検出するため、良好です。変数を使って動作させることができます。ここでは、演算子は何を検索するのかを定義できます( '-P' /' -T'など) – FirstOne

+0

です。私はpreg/preg_functionsを知らない。しかし、そのアイデアはそこにあります;) – FirstOne

+0

@Kuppurajあなたは歓迎です – fantaghirocco

2

これを試してみてください:

$t = '211111111131-P,2-T,3654554-P,4-R,5-C,6-T,'; 
$find = "-P";   // Search element 
$found = [];   // Result array 
$array = explode(",", $t); // Breaking up into array 
foreach($array as $arr) { 
    if (strpos($arr, $find)) { // Checking if search element is found in $arr 
     $found[] = explode('-',$arr)[0]; // Extracting the number prefix e.g 1 for 1-P 
    } 
} 

出力:

Array 
(
    [0] => 1 
    [1] => 3 
) 
+0

あなたの答えは正しいですが、$ t = '211111111131-P、2-T 、3654554-P、4-R、5-C、6-T '';動作していないと、それは唯一の最初の要素を返します。 – rajkuppus

+0

今すぐ完璧に動作します。ありがとう@オブジェクトマニピュレータ – rajkuppus

1

$t = '1-P,2-T,3-P,4-R,5-C,6-T,'; 
$data = explode(",", $t); 
print_r($data); 
$row=array(); 
for ($i = 0; $i <= count($data); $i++) { 
    if (!empty($data[$i])) { 
     if (strpos($data[$i], '-T') !== false) {// pass find value here 
      $final = explode("-", $data[$i]); 
      $row[]=$final[0]; 
     } 
    } 
} 
print_r($row); 

出力

Array 
(
    [0] => 2 
    [1] => 6 
) 
として使用してください

DEMO

+0

あなたの答えは完璧に働いています。ありがとう – rajkuppus

1
$t = '1-P,2-T,3-P,4-R,5-C,6-T,'; 
$temp = []; 
// if the last comma is not typo the 3rd argument `-1` omit empty item 
$array = explode(",", $t, -1); 
foreach($array as $arr) { 
    list($v, $k) = explode('-', $arr); 
    $temp[$k][] = $v; 
} 

print_r($temp['T']); 

demo

+0

@KuppurajShanmugam何が "働いていない"という意味ですか - https://eval.in/607021 – splash58

+0

申し訳ありませんが、間違って検証しました。 – rajkuppus

2

ここではたくさんの回答がありますが、最初はデータをより良い構造にするというアプローチはありません。

$t = '1-P,2-T,3-P,4-R,5-C,6-T,'; 

$a = array_filter(explode(',', $t)); 

$map = []; 

foreach($a as $item) { 
    $exploded = explode('-', $item); 
    $number = $exploded[0]; 
    $letter = $exploded[1]; 
    if (!array_key_exists($letter, $map)) { 
     $map[$letter] = []; 
    } 
    $map[$letter][] = $number; 
} 

print_r($map); 
// Array 
// (
//  [P] => Array 
//   (
//    [0] => 1 
//    [1] => 3 
//  ) 
// 
//  [T] => Array 
//   (
//    [0] => 2 
//    [1] => 6 
//  ) 
// 
//  [R] => Array 
//   (
//    [0] => 4 
//  ) 
// 
//  [C] => Array 
//   (
//    [0] => 5 
//  ) 
// 
//) 

print_r($map['T']); 
// Array 
// (
//  [0] => 2 
//  [1] => 6 
//) 
print_r($map['P']); 
// Array 
// (
//  [0] => 1 
//  [1] => 3 
//) 
関連する問題