【问题标题】:Detecting new permutations in multidimensional array检测多维数组中的新排列
【发布时间】:2015-04-25 13:01:44
【问题描述】:

在我们的数据库中,我们有一个表,它是三个表的每个排列的结果。

我正在尝试编写一个 PHP 脚本,它将所有这些表视为数组并检测是否缺少排列。

例如

$foo = array('one', 'two', NULL)
$bar = array('three', 'four', NULL)
$baz = array('five', 'six', NULL)

$permutations = array(
  array('one', 'three', 'five'),
  array('two', 'three', 'five'),
  array(NULL, 'three', 'five'),
  //etc
)

foreach $foo as $x
  foreach $bar as $y
    foreach $baz as $z
      $combo = array($x, $y, $z)
      if $combo is not in $permutations
         //generate sql to update db

我怎样才能做到这一点?

【问题讨论】:

  • 如果您有 X 个表,每个表都有 Y 个元素 (??),如果这是“重复排列”,那么您将有 X^Y 排列。因此,快速冒烟测试将确保 $permutations 长度与 X^Y 相同(或任何集合范围应该)......你也可以做一些事情,比如确保$permutations 在进行长度检查之前只有唯一元素。这可能比检查每一个可能的排列更有效。

标签: php arrays recursion multidimensional-array


【解决方案1】:

我不知道你想做什么,但我建议:

$foo = array('one', 'two', NULL);
$bar = array('three', 'four', NULL);
$baz = array('five', 'six', NULL);

$permutations = array(
  array('one', 'three', 'five'),
  array('two', 'three', 'five'),
  array(NULL, 'three', 'five'),
  //etc
);

$foobarbaz = array_merge($foo, $bar, $baz);
foreach($foobarbaz as $k){ 
  if(!in_array($k, $permutations) {
     $sql_trigger_start();
  }
}

遇到此问题的示例。 http://dannyherran.com/2011/06/finding-unique-array-combinations-with-php-permutations/

【讨论】:

  • array_merge 不起作用。反正不是这样的。 $permutations 数组当前包含 $foo、$bar 和 $baz 数组的所有可能组合。然而,有时 $foo、$bar、$baz 数组会添加新项目,这意味着 $permutations 数组不再包含所有组合。我需要一种针对 $permutations 数组测试每个可能组合的方法,并检测它何时不存在,以便生成 SQL 语句。这有意义吗?
  • 是的,谢谢你可以通过这个链接解决你的问题dannyherran.com/2011/06/…
【解决方案2】:

您必须使用 MySQL 检索每个可能的排列,并在第 4 个表上使用 LEFT JOIN 并测试是否不匹配

如果您有 3 个表 t1、t2、t3 包含一列“值”,而表 t4 是包含三列 t1、t2 和 t3 的“排列”,您可以获得不存在的“排列”以下查询

SELECT t1.value v1, t2.value v2, t3.value v3
FROM t1, t2, t3
LEFT JOIN t4 ON t4.t1=v1 AND t4.t2=v2 AND t4.t3=v3
WHERE t4.t1 IS NULL;

您可以调整此查询以匹配您的数据库架构。

【讨论】:

  • 你应该模拟一个完整的外连接来在一个查询中得到答案。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2020-01-06
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多