array_intersect&的不规则性array_unique

时间:2015-06-11 20:55:22

标签: php mysql

我遇到与array_intersect和array_unique的使用相关的不规则事件的问题。

请记住,这是一个古老的环境,而且无法使用mysqli。

我脚本的第一步有四个MySQL查询。 它们具有相同的结构:

$aid_1 = mysql_query("SELECT aid FROM xy WHERE (bid = '20' OR bid = '34') AND baseData BETWEEN $select_1 AND $select_2");

$select_1等等来自HTML选择列表(总共八个,一次两个作为"来自"和#34;到#34;对于一个作用域)。 这个程序工作正常,我检查结果如下:

while($row_aid_1 = mysql_fetch_array(aid_1))
{
    echo '</br> — ' . $row_aid_1['aid'] . '</br>';
}

这是发生违规行为的第二步。 我想获得在第一步的所有四个查询的结果中找到的值。 我意识到这一点:

while(($row_aid_1 = mysql_fetch_array($aid_1)) && ($row_aid_2 = mysql_fetch_array($aid_2)) && ($row_aid_3 = mysql_fetch_array($aid_3)) && ($row_aid_4 = mysql_fetch_array($aid_4)))
{
    $aid_array = array($row_aid_1, $row_aid_2, $row_aid_3, $row_aid_4);
    $aid_ai = call_user_func_array('array_intersect', $aid_array);
    $aid_u = array_unique($aid_ai);

    print_r('</br> — ' . $aid_u[0] . '</br>');

    var_dump($aid_u);
}

同样,print_rvar_dump用于检查结果。 关于array_intersect只要使用上述选择列表中的最低值或相当高的值,这些就没有问题。 如果使用的是比最低/最高值更高的值,则该功能仅在某些情况下有效。 它没有的时间,日志显示&#34; PHP注意:未定义的索引&#34;或&#34; PHP注意:未定义的偏移量:0&#34;对于倒数第三行(print_r('</br> — ' . $aid_u[0] . '</br>');)。 如上所述,我无法设法确定错误究竟是什么,只是有时候。 很明显,错误必须在第二步中的某处,因为第一步在所有情况下都有效(如上所述进行交叉检查),并且在第一步中定义了索引/偏移。

我在array_unique之前用array_values尝试了一个中间步骤,但这并没有改变任何东西。

array_unique根本不起作用。 结果几乎总是打印两次。

如果有人能够理解并解释为什么索引或偏移量有时是未定义的以及为什么array_unique不起作用,我将非常感激。

1 个答案:

答案 0 :(得分:1)

您只是将每一行相交,而不是将所有结果作为一组交叉。这仅在所有查询以相同顺序返回相同结果时才有效。

相反,为每个查询创建一个包含所有结果的数组,然后将它们全部交叉。

$aid1_results = array();
while ($row = mysql_fetch_assoc($aid_1)) {
    $aid1_results[] = $row['aid'];
}
$aid2_results = array();
while ($row = mysql_fetch_assoc($aid_2)) {
    $aid2_results[] = $row['aid'];
}
...
$aid_ai = array_intersect($aid1_results, $aid2_results, $aid3_results, $aid4_results);

您也可以在SQL中使用JOIN

SELECT t1.aid
FROM (SELECT aid FROM ... WHERE ...) AS t1
JOIN (SELECT aid FROM ... WHERE ...) AS t2 ON t1.aid = t2.aid
JOIN (SELECT aid FROM ... WHERE ...) AS t3 ON t1.aid = t3.aid
JOIN (SELECT aid FROM ... WHERE ...) AS t4 ON t1.aid = t4.aid