【问题标题】:Get specific content from a string从字符串中获取特定内容
【发布时间】:2016-11-20 22:40:12
【问题描述】:

我需要从给定的字符串中获取数字作为数组。

示例字符串:

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

预期输出:

  • 如果我搜索-T,输出需要是这样的:
大批( [0] => 2, [1] => 6 )
  • 如果是-P:
大批( [0] => 1, [1] => 3 )

我尝试了var_export(explode("-T,",$t));,但没有按预期工作。 有人可以给我一个建议吗?

【问题讨论】:

  • 为什么它只为P 而不是1 返回3?毕竟,3-P1-P 都有。
  • 我只是在等待怀孕狂xD

标签: php string-matching


【解决方案1】:

试试这个:

$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
)

【讨论】:

  • 你的答案是正确的,但如果是这样 $t = '211111111131-P,2-T,36​​54554-P,4-R,5-C,6-T,';不工作它只返回第一个元素。
【解决方案2】:

把它当做

$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

【讨论】:

    【解决方案3】:
    $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

    【讨论】:

    【解决方案4】:

    以下匹配搜索词-P之前的完整整数。
    让我们保持简洁:

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

    搜索'/([0-9]+)\-P/'/([0-9]+)\-C/'/([0-9]+)\-T/ 等等。


    一种更动态的方式来查找不同的搜索词/过滤器:

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

    请参阅 preg_match_allpreg_quote 函数。

    【讨论】:

    • 这个解决方案很好,因为它也能找到长度 > 1 的数字。您可以使其与变量一起使用,其中操作可以定义动态搜索的内容(-P / -T 等)
    • 你是。我不知道 preg / preg_functions。但想法就在那里;)
    • 这是最好的解决方案
    【解决方案5】:

    这里已经有很多好的答案,但没有一个采用首先将数据放入更好结构的方法。

    下面的代码将数据转换为关联数组,将字母映射到数字数组,这样您就可以通过任何您想要的字母重复查找:

    $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
    // )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多