2014-03-28 5 views
-1

Цель состоит в том, что сопоставленные идентификаторы удаляются, возвращая оставшиеся значения в массиве.Предупреждение: неверный аргумент для foreach() и PHP Warning: 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 Warning: array_diff(): Аргумент #-не является массив Внимание: Недействительного аргумента для Еогеаспа().

Пожалуйста, поделитесь предложениями со мной.

+0

$ существующий массив должен быть объявлен вне цикла. и проверьте значения $ existing array, используя функции отладки, такие как print_r или var_dump. Используйте, как оно есть вместо implode – Sundar

ответ

1

Эта ошибка возникает, поскольку после запуска implode на $newarray она преобразуется в строку, поэтому она дает вам эту ошибку. Для получения дополнительной информации ознакомьтесь PHP Manual

http://us3.php.net/implode

implode возвращает строку

0

После разрушающегося этих значений с помощью запятой, Вы не можете Foreach этих значений.

Поскольку значения, сохраненные в $ newarray будет как значению1, значение2, Value3 и т.д ...

SO вы не можете 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 share другое решение .. – user3458420

+0

Я обновил ваш код запроса, пожалуйста, проверьте его –

+0

Нет .. Те же проблемы идут. У меня есть сомнения, после того, как он взорвал массив. могу ли я написать метод foreach()? Правильно это или нет? – user3458420

0

A несколько замечаний, которые я замечаю:

  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 является индексом в таблицу:

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

Смежные вопросы