【问题标题】:Matching values from two arrays, and insert into db if all are true匹配来自两个数组的值,如果都为真则插入到 db
【发布时间】:2013-04-14 07:39:29
【问题描述】:

我有两个数组,一个名为 $requirements 的数组可以保存多个值对。示例:

array
  'name1' => int 1000

或:

array
  'name1' => int 1000
  'name2' => int 2000
  'name3' => int 3000

我还有第二个数组,名为$values,它包含必须超过要求的值。示例:

array
  'name1' => int 2683

或:

array
  'name1' => int 4552
  'name2' => int 324
  'name3' => int 1718

我想匹配每个值对以确保它们超出要求。如果有,请运行插入查询。

现在,我已经通过创建一个名为 $result 的单独数组来完成此操作,该数组为每个匹配项保存真/假,并给出以下结果:

array
  'name1' => boolean true

或:

array
  'name1' => boolean true
  'name2' => boolean false
  'name3' => boolean false

只是为了在 $result 数组上再次运行 foreach 以确保在插入之前它们都是真的。

我想知道是否有更好的方法来做到这一点?最好没有$result 数组步骤。

我还要注意$values 数组不能编辑,因为它会被多次使用。

【问题讨论】:

  • 我忘了指出要做到这一点,一个值必须匹配或高于要求。
  • 结果是多余的——为什么不把需求和值的比较放在一个函数中并调用两次呢?
  • 我认为你不能避免$result array step如果你不能,那么)不写繁琐的代码

标签: php arrays foreach


【解决方案1】:

您可以根据要求逐一检查值,保留布尔值并在值不满足要求时中断。像这样的:

$res = true;
foreach ($requirements as $k => $v) {
    $res = $res && ($values[$k] => $v);

    if (!$res) break;
}

最后你可以检查$res来决定你的查询是否必须执行。

【讨论】:

  • 啊,是的,谢谢!我不敢相信打破 foreach 循环我什至没有想到..
【解决方案2】:

您可以使用array_walk 并对每个数组元素执行回调。使用 userdata 参数来比较需求,然后在值无效的地方设置 false。当您循环时,您只需要检查该值是否为假。回到我的电脑后,我将编辑以添加代码。

【讨论】:

    【解决方案3】:

    好的,这是我在评论中谈到的繁琐代码的示例(注意:不要把它放在你的生产代码中:D)

      $req = array(
         'name1' => 1000,
         'name2' => 2000,
         'name3' => 3000
      );
    
      $vals = array(
         'name1' => 4552,
         'name2' => 324,
         'name3' => 1718
      );
    
      $sql = "INSERT INTO `the_table`(`key`,`val`) VALUES";
    
      $sql .= implode(',', array_map(function ($map_val)
      {
         return "(`$map_val`, 1)";
      }, array_filter(array_keys($vals), function ($key)
      {
         global $req, $vals;
         return isset($req[$key]) && $req[$key] >= $vals[$key];
      })));
    
      var_dump($sql);
    

    输出

    string 'INSERT INTO `the_table`(`key`,`val`) VALUES(`name2`, 1),(`name3`, 1)' (length=68)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2017-11-17
      相关资源
      最近更新 更多