数组相交给出错误的输出

时间:2010-05-14 06:18:39

标签: php arrays

我需要在两个数组之间找到共同的元素。我的代码是:

$sql="SELECT DISTINCT fk_paytbl_discounts_discountid as discountid from paytbl_discounts_students WHERE fk_vtiger_cf_601='".$categoryid."'";
$discountstudentinfo=$objdb->customQuery($sql,false);

$sql1="SELECT DISTINCT fk_paytbl_discounts_discountid as discountid from paytbl_discounts_variants WHERE fk_vtiger_products_productid='".$variantid."'";
$discountvariantinfo=$objdb->customQuery($sql1,false);

$commondiscount=array_intersect($discountvariantinfo,$discountstudentinfo);

第一个数组

Array
(
    [0] => Array
        (
            [discountid] => 2
        )

    [1] => Array
        (
            [discountid] => 8
        )

    [2] => Array
        (
            [discountid] => 5
        )

    [3] => Array
        (
            [discountid] => 4
        )

)

第二个数组

Array
(
    [0] => Array
        (
            [discountid] => 1
        )

    [1] => Array
        (
            [discountid] => 5
        )

)

公共数组

Array
(
    [0] => Array
        (
            [discountid] => 1
        )

    [1] => Array
        (
            [discountid] => 5
        )

)

Common数组应该只有5,但它的显示也是。

请帮我解决这个问题

由于

1 个答案:

答案 0 :(得分:1)

http://php.net/array_intersect

  

注意:考虑两个要素   等于且仅当(字符串)$ elem1   ===(字符串)$ elem2。用文字表示:当字符串表示相同时。

因此,您遇到问题的原因是:例如:

(string) array('discountid' => 5) == (string) array('discountid' => 8)

如果您运行的是PHP 5.3,这是一个解决方案:

$comparisonFunction = function($elem1, $elem2) {
    return $elem1['discountid'] == $elem2['discountid'];
}
$commondiscount = array_uintersect(
    $discountvariantinfo,
    $discountstudentinfo,
    $comparisonFunction
);

在PHP 5.3之前,你可以使用uglier create_function()而不是漂亮的闭包。如果你在一个方法中执行,很可能很容易使用一个新的私有方法作为回调。

如果你没有使用PHP 5.3并且你真的不想使用回调,你可以使用以下想法:

$uniqueDiscounts = array();
foreach ($discountvariantinfo as $dvi) {
    $uniqueDiscounts[$dvi['discountid']] += 1;
}
foreach ($discountstudentinfo as $dsi) {
    $uniqueDiscounts[$dsi['discountid']] += 1;
}

$commondiscount = array();
foreach ($uniqueDiscounts as $ud => $count) {
    if ($count == 2) {
        $commondiscount[] = array('discountid' => $ud);
    }
}

当然,您会想要整理一下或添加注释来解释算法。