1

我有两个数组,一个命名$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

然后再次在数组上运行 foreach$result以确保在插入之前它们都是正确的。

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

我还想指出,该$values数组无法编辑,因为它将被多次使用。

4

3 回答 3

0

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

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

    if (!$res) break;
}

最后,您可以检查$res以决定是否必须执行查询。

于 2013-04-21T09:28:41.113 回答
0

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

于 2013-04-21T09:29:12.027 回答
0

好的,这是我在评论中谈到的繁琐代码示例(注意:不要将它放在您的生产代码中: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)
于 2013-04-21T09:35:17.410 回答