2014-03-28 115 views
-1

目的是移除匹配的id,并返回数组中的其余值。警告:为foreach()和PHP提供的参数无效警告:array_diff():参数#1不是数组

这是我的脚本:

function example($link, $onlist) 
{ 
    //$newarray = array(); 
    $newarray = implode(',', $onlist); 
    foreach ($newarray as $key) 
    { 
     $query = mysql_query("select * from table where id = '".$newarray."'"); 
     $existing = array(); 
     while($cz = mysql_fetch_assoc($query)) 
     { 
      $existing[] = $cz['id']; 
     } 
    } 

    $ex = array_diff($newarray, $existing); 
    return $ex; 
} 

如果我运行此脚本。它显示错误:

PHP警告:array_diff():参数#1不是数组警告: 为foreach()提供的无效参数。

请与我分享建议。

+0

$现有阵列应该循环之外声明。并使用print_r或var_dump等调试函数检查$ existing数组的值。使用它,而不是内爆 – Sundar

回答

1

发生此错误是因为在运行implode$newarray它被转换为字符串,这就是为什么它会给你这个错误。欲了解更多信息检查PHP手册

http://us3.php.net/implode

implode返回字符串

0

使用逗号爆这些值后,你不能的foreach这些值。

由于存储在$ newarray值会像值1,值2,值3,等等

,所以你不能的foreach它...

0

function example($link, $onlist) 
{ 
    $newarray = array(); 
    $existing = array(); 
    $onlist = is_array($onlist) ? $onlist : array($onlist); 

    if(!empty($onlist)){ 
    $newarray = $onlist; 

    foreach ($onlist as $key) 
    { 

     $query = mysql_query("select * from table where id = '".$key."'"); 

     while($cz = mysql_fetch_assoc($query)) 

     { 

      $existing[] = $cz['id']; 

     } 



    } 

} 


    return array_diff($newarray, $existing); 

} 
+0

我试试这个代码..但是同样的问题来了.. PLZ分享其他解决方案.. – user3458420

+0

我已经更新你的查询代码,请检查它 –

+0

没有..相同的问题即将到来。在爆炸阵列之后,我怀疑。我可以写foreach()方法吗?是对还是不对? – user3458420

0

一试我注意到一些事情:

  1. implode()接受一个数组并变成一个字符串。根据$onlist是什么,你可能想要explode()(如果它是一个字符串)或者只是原样使用它(如果它是一个数组)。我将假定它是一个逗号分隔的字符串。
  2. mysql_*方法已被弃用。您应该使用替代品,例如mysqli_*
  3. MySQL查询获取所有行行,其中id$newarray。它应该取代id$key的所有行。
  4. 由于您只对数据库中的id字段感兴趣,因此您只应该请求该列(否则,您无意中将所有其余列移动)。
  5. 它看起来像你的表id是一个独特的价值。你可以保存一些处理,然后抓住第一个返回的行(如果有的话)。
  6. 您正在重新设置$existing每次您检查一个新的id。您只想在开始时重置一次。
  7. 您的功能example收到$link从未使用的变量。

因此,基于这一切,这里是你的代码的版本,应该工作:

function example($link, $onlist) 
{ 
    // Convert the comma-separated string to an array 
    $newarray = explode(',', $onlist); 

    // Start an empty array 
    $existing = array(); 

    // Collect all the ids that are found in the database 
    foreach ($newarray as $key) 
    { 
     $query = mysqli_query("SELECT `id` FROM `table` WHERE `id` = '" . $key . "';"); 
     if($cz = mysqli_fetch_assoc($query)) 
     { 
      $existing[] = $cz['id']; 
     } 
    } 

    // Get only the ids that were NOT found 
    $ex = array_diff($newarray, $existing); 

    return $ex; 
} 

一个与你的战略需要注意的重要一点是,你会做一个MySQL查询了每一个你想要匹配的ID。你也可以这样做在一个单一的查询,这往往会多获得更好的性能,特别是如果id是一个索引到表:

function example($link, $onlist) 
{ 
    // Convert $onlist from "a,b,c,1,2,3" to "'a','b','c','1','2','3'" 
    $tmp_array = explode(',', $onlist); 
    $onlist = "'" . implode("','", $tmp_array) . "'"; 

    // Start an empty array 
    $existing = array(); 

    // Get *all* rows that have *any* of the IDs in $onlist 
    $query = mysqli_query("SELECT `id` FROM `table` WHERE `id` IN (" . $key . ");"); 
    while($cz = mysqli_fetch_assoc($query)) 
    { 
     $existing[] = $cz['id']; 
    } 

    // Keep only the ids that were NOT found 
    $ex = array_diff($newarray, $existing); 

    return $ex; 
} 
+0

我正在尝试这个例子,但它显示错误:警告:为foreach()和Warning:explode()提供的无效参数期望参数2是字符串,数组中给出的PHP警告:array_diff ):参数#1不是...中的数组显示这些错误。请给我建议.. – user3458420

相关问题