【问题标题】:how to check multiple items are in an array or not with PHP如何使用PHP检查多个项目是否在数组中
【发布时间】:2015-12-03 19:21:45
【问题描述】:

我正在读取用户上传的 RTF 文件,然后我在每个 \pard 上分解该文件以获取每一行,然后将每行 preg_split 拆分为一个数组。然后我循环遍历数组以查找某个值并获取它旁边的数据。所有这一切都很好,但是多次寻找多个字符串的最佳方法是什么?这是我目前所拥有的:

$data = explode('\pard',$rtf);

foreach ($data as $item) {
    $values = preg_split('/[\t]/', $item);
    if (in_array('shipped yesterday', $values)){
        $key = array_search('shipped yesterday', $values);
        print $values[$key + 1];
    }else{
        print_r($values);
    }
}

RTF 文件如下所示:

booked in yesterday    50    41    78
packaged yesterday     62    45    48
shipped yesterday      46    52    62

所以我上面的代码正在寻找“昨天发货”然后获取它旁边的第一个值,在本例中为 46。

对于“昨天预订”和“昨天打包”的其余值,最有效的方法是什么?

【问题讨论】:

  • 查找哈希图,使用它们可能会得到一个非常有效的实现。

标签: php arrays


【解决方案1】:

我认为最快的方法是一个简单的正则表达式。

preg_match_all('/((?:booked in|packaged|shipped) yesterday)\s+(\d+)/i',$rtf,$matches);
$values = array();
foreach($matches[1] as $key => $match){
    $values[$match] = $matches[2][$key];
}
print_r($values);

这会将所有匹配给定模式的内容解析为一个数组

Array ( 
   ['booked in yesterday'] => '50'
   ['packaged yesterday'] => '62'
   ['shipped yesterday'] => '46'
   )

注意是否需要在传入数组之前解析数值

$values[$match] = intval($matches[2][$key]);

matches 的输出将是这样的,只是为了阐明数组的构建:

Array ( 
    [0] => Array ( 
        [0] => 'booked in yesterday 50'
        [1] => 'packaged yesterday 62'
        [2] => 'shipped yesterday 46'
        ) 
    [1] => Array ( 
        [0] => 'booked in yesterday'
        [1] => 'packaged yesterday'
        [2] => 'shipped yesterday'
        ) 
    [2] => Array ( 
        [0] => '50'
        [1] => '62'
        [2] => '46'
        )
    )

【讨论】:

    【解决方案2】:

    也许您可以尝试在所需的测试字符串数组中运行另一个foreach?

    看看这个:-

    <?php
    $checkString = array("shipped yesterday","booked in yesterday","packaged yesterday");
    $data = explode('\pard',$rtf);
    
    foreach ($data as $item) 
    {
        $values = preg_split('/[\t]/', $item);
        foreach($checkString as $check)
        {
            if (in_array($check, $values))
            {
                $key = array_search($check, $values);
                print $values[$key + 1];
            }
            else
            {
                print_r($values);
            }
        }
    
    }
    ?>
    

    【讨论】:

      【解决方案3】:

      您的代码对我来说看起来不错,您可以摘录一段并将其用作函数。但是,当您询问效率时,值得注意的是isset is faster than in_array

      例如...

      function checkForValue($searchterm, $values) {
        if (isset($values[$searchterm]))
          return $values[$searchterm];
        }else{
          return "$searchterm not found";
        }
      }
      
      $data = explode('\pard',$rtf);
      
      foreach ($data as $item) {
        $values = preg_split('/[\t]/', $item);
        print checkForValue('shipped yesterday', $values);
        print checkForValue('packaged yesterday', $values);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        相关资源
        最近更新 更多