foreach 循环中的array_intersect

Posted

技术标签:

【中文标题】foreach 循环中的array_intersect【英文标题】:array_intersect within foreach loop 【发布时间】:2012-10-12 23:51:33 【问题描述】:

这是我第一次在这里发帖,虽然我在阅读这里的帖子时获得了很多很棒的技巧和技巧。

这是我的目标:

我有 2 个有点相似的表格要比较。对于每个表的每一行,我都将我想要的字段放入一个数组中。

我基本上想从一个表中回显出在另一个数组中具有匹配值的任何数组的值。

这是我的代码,也许会更容易理解。

$sql = "SELECT * FROM $i_comp ORDER BY `manufacturer`";
$statement = $objDb->query($sql);
$c_skus = $statement->fetchAll(PDO::FETCH_ASSOC);

$sql = "SELECT `sku_one`,`sku_two`,`qty`,`manufacturer`";
$sql .= "FROM $i_gas ORDER BY `manufacturer`";
$statement = $objDb->query($sql);
$d_skus = $statement->fetchAll(PDO::FETCH_ASSOC);

foreach ( $c_skus as $c_sku ) 
    // i want to see if any values of this array exist in the array created hy
    // the foreach loop below (yes, repeat for each row)
    $c = array($c_sku['sku'],$c_sku['sku_one'],$c_sku['sku_two'],$c_sku['sku_three']);
    foreach ( $d_skus as $d_sku ) 
        $d = array($d_sku['sku_one'],$d_sku['sku_two']);
        $intersect = array_intersect($c, $d);
        echo '<pre>', print_r($intersect), '</pre>';
    

以下是每次代码迭代我收到的结果:

Array
(
)
1

还应该注意的是,我不关心键,只关心值。最终,这些值将在 INSERT 语句中起作用,但目前我只需要得到正确的结果。

无论如何,感谢您的任何帮助!

【问题讨论】:

你是在问如何处理你得到的输出吗? 如果我们理解您的逻辑,肯定可以使用 SQL 完成一些事情 我真的认为您应该只使用 SQL 连接语句来完成此任务,除非您需要问题中未说明的内容。 我的目标是:在 INSERT 语句中使用 d.qty。但是当我在吃奶的时候,我想为所有匹配的行 c.sku 和 d.qty 回显,然后我会手动检查其中的一些以确保它给出正确的结果。 Imre L 在下面发布的所有代码一开始都运行良好,但现在看来它们运行缓慢。是否有可能我的表没有正确索引? 【参考方案1】:

这通常在 SQL 中完成

如果您想要在另一个表中包含至少 1 个匹配 SKU 的整行:

$sql = "
SELECT c.* FROM $i_comp AS c 
  JOIN $i_gas AS d 
    ON d.sku_one in (c.sku, c.sku_one, c.sku_two, c.sku_three) 
    OR d.sku_two in (c.sku, c.sku_one, c.sku_two, c.sku_three) 
 ORDER BY c.`manufacturer`";
$statement = $objDb->query($sql);
$c_skus = $statement->fetchAll(PDO::FETCH_ASSOC);
// all rows that have at least 1 matching sku on another table
print_r($c_skus);

如果您只想要 SKU

$sql = "
SELECT d.sku_one FROM $i_comp AS c 
  JOIN $i_gas AS d 
    ON d.sku_one in (c.sku, c.sku_one, c.sku_two, c.sku_three) 
UNION
SELECT d.sku_two FROM $i_comp AS c 
  JOIN $i_gas AS d 
    OR d.sku_two in (c.sku, c.sku_one, c.sku_two, c.sku_three) 
 ";
$statement = $objDb->query($sql);
$c_skus = $statement->fetchAll(PDO::FETCH_ASSOC);
// all skus that have at least 1 matching sku on another table
print_r($c_skus);

php intersect 变体中,您需要单独构建数组,然后使用array_intersect

$c = array();
foreach ( $c_skus as $c_sku ) 
    $c[] = $c_sku['sku'];
    $c[] = $c_sku['sku_one'];
    $c[] = $c_sku['sku_two'];
    $c[] = $c_sku['sku_three'];

$d = array();
foreach ( $d_skus as $d_sku ) 
    $d[] = $d_sku['sku_one'];
    $d[] = $d_sku['sku_two'];


$intersect = array_intersect($c, $d);
echo '<pre>', print_r($intersect), '</pre>';

【讨论】:

这三个人的作品都很棒!第一个对我来说是最实用的,因为我已经全部尝试过了。所以现在我需要循环这个查询,而且大部分都是简单的部分。我正在测试的荒谬查询确实对数据库造成了负担,因此我的下一轮测试涉及将所有数据拉入 php 并使用 array_intersect 或一个非常复杂的 if(in_array(.......) 循环很棒的建议!

以上是关于foreach 循环中的array_intersect的主要内容,如果未能解决你的问题,请参考以下文章

如何使用foreach循环进入另一个foreach循环来遍历c​​odeigniter中的两个不同的数据表?

C#中的foreach循环怎么用?

解释php中的foreach循环[重复]

foreach和List.Foreach 退出循环相关问题

C#中foreach语句的作用?

ForEach 循环中的 VStack 不尊重 WatchOS 中的对齐参数