2012-10-12 124 views
4

这是我第一次发布在这里,虽然我已经得到了许多伟大的技巧和技巧阅读这里的帖子。array_intersect内foreach循环

这里是我的目标:

我有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语句中,但目前我只需要获得正确的结果。

无论如何,感谢任何和所有的帮助!

+0

你问你该如何处理输出? – thescientist

+3

如果我们理解你的逻辑肯定是可以用SQL – Baba

+1

完成的事情,那么我真的认为你应该为这个任务使用SQL连接语句,除非你需要你的问题中没有提到的东西。 – Sven

回答

1

这通常是在SQL

做,如果你想整行已至少另一个表匹配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相交变体,您需要单独构建阵列,然后使用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>'; 
+0

与所有3的伟大工作!第一个对我来说是最实际的,我已经尝试过所有这些。所以现在我需要循环查询这个查询,而且大部分都是这个简单的部分。 我正在测试的荒谬查询实际上是对数据库征税,所以我的下一轮测试涉及将所有数据都拉入到php中,并使用array_intersect或非常复杂的if(in_array(.......) 感谢您的宝贵意见! –