【问题标题】:Search for matching partial values in an array [duplicate]在数组中搜索匹配的部分值[重复]
【发布时间】:2017-05-08 02:38:45
【问题描述】:
$target = 285
$array = array("260-315", "285-317", "240-320")

我需要在数组中搜索以 $target 值开头的值。此外,$target 值将不限于 3 位数字,因此我正在搜索连字符前的数字匹配。

所以我想结束

$newTarget = 285-317
$finalTarget = 317

注意:我只搜索连字符前的数字匹配,因此“200-285”不会匹配

【问题讨论】:

  • 向我们展示你的想法......
  • 你知道260-315(和其他人)会被计算成-55吗?
  • 类似这样的东西:-eval.in/702826(但你的数组值需要是字符串,否则它会被自动减去并显示-55 @u_mulder说)
  • 似乎无需计算即可工作。我应该如何分隔数字?
  • 不知道还有多少array_filter 答案可以挤进这个问题。

标签: php arrays


【解决方案1】:

你在评论中问我什么(在我的答案下方),因为你可以像下面那样做(我改变的答案):-

<?php
$target = 285;
$array = array('260-315', '285-317', '240-320',"200-285");
foreach($array as $key=>$value){
    if($target ==explode('-',$value)[0]){
       echo $newTarget = $array[$key];
       echo PHP_EOL;
       echo $finalTarget = explode('-',$array[$key])[1];
    }
}
?>

https://eval.in/702862

【讨论】:

  • 如果其中一个值是 200-285 怎么办?连字符前的数字是目标。
  • 我的意思是我试图找到匹配的唯一数字是连字符之前的数字。所以如果目标是 285 那么 200-285 不应该是匹配的。
【解决方案2】:

我可以帮助您将数组过滤到以您的目标开头的成员。

然后您可以拆分返回值以达到最终目标。

<?php
$target = '285';
$array = array('260-315', '285-317', '240-320');


$out = array_filter($array, function($val) use ($target) {
    return strpos($val, $target) === 0;
});

var_export($out);

输出:

array (
  1 => '285-317',
)

【讨论】:

    【解决方案3】:
    <?php
    $target = 285;
    $arrStack = array(
        "260-315",
        "285-317",
        "240-320",
    );
    
    
    $result = preg_grep('/'.$target.'/',$arrStack);
    
    echo "<pre>"; print_r($result); echo "</pre>";
    

    【讨论】:

      【解决方案4】:

      这样的东西对你有用吗? array_filter

      $target = 285;
      $array = array("260-315", "285-317", "240-320");
      $newTarget = null;
      $finalTarget = null;
      
      $filteredArray = array_filter($array, function($val) use ($target) {
          return strpos($val, $target."-") === 0;
      });
      
      if(isset($filteredArray[0])){
          $newTarget = $filteredArray[0];
          $finalTarget = explode($filteredArray[0], "-")[1];
      }
      

      【讨论】:

        【解决方案5】:

        您可以排除与array_filter 不匹配的内容,而不是查找匹配的内容。

        例如:

        $target = 285;
        
        $original = array('260-315', '285-317', '240-320');
        
        $final = array_filter($original, function ($value) use ($target) {
        
            // Check if match starts at first character. Have to use absolute check
            // because no match returns false
            if (stripos($value, $target) === 0) {
        
               return true;
        
            }
        
            return false;
        
        });
        

        $final 数组将是 $original 数组的副本,没有不匹配的值。

        要输出第一个数字,您可以遍历匹配数组并获取连字符之前的值:

        foreach ($final as $match) {
        
            $parts = explode('-', $match);
        
            if (is_array($parts) && ! empty($parts[0])) {
        
                // Show or do something with value
                echo $parts[0];
        
            }
        }
        

        【讨论】:

          【解决方案6】:

          使用array_filter:

          例子:

          $target = '260';
          $array = ['260-315', '285-317', '240-320'];
          
          $matches = array_filter($array, function($var) use ($target) { return $target === explode('-', $var)[0]; });
          
          print_r($matches);
          

          输出:

          Array
          (
              [0] => 260-315
          )
          

          【讨论】:

            猜你喜欢
            • 2014-09-07
            • 2011-10-22
            • 2013-04-03
            • 2017-08-12
            • 2014-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-19
            相关资源
            最近更新 更多