2013-02-19 3 views
-2

Я разработал этот небольшой код, чтобы проверить, имеют ли 2 текста, один из базы данных и другой из внешнего вложения, общие слова. Проблема в том, что я получаю сообщение «Аргумент не массив». Я не вижу, где проблема. Мне также нужно проверить, находятся ли 2 сообщения, если они должны иметь одни и те же слова, в одной последовательности. Пожалуйста, помогите понять, где ошибка. Благодаряarray_intersect() Аргумент не является массивом

$checkMsg=strip_tags($_POST['checkMsg']); // message from input form 
$message // message from database 
$MsgWords = preg_split("/[\s,]+/", $checkMsg); 
if(!empty($checkMsg)){ 
     foreach ($MsgWords as $Neword) 
     {   $Neword = trim($Neword); 

      echo " $Neword"; 
     } 
      $word = preg_split("/[\s,]+/", $message); 

     foreach ($word as $currentWord) 
      { 
             $currentWord = trim($currentWord); 

       echo " $currentWord"; 
      } 


      $intersect=array_intersect($Neword , 
             $currentWord); 
        echo" Your common words are: $intersect";}else{echo "No common words";} 
+6

$ neword и $ currentword - это просто строки. вы вообще не пересекаете массивы. Итак ... большой сюрприз ... PHP говорит вам об этом. –

+1

Надеюсь, вы знаете, какой массив. – vikingmaster

ответ

0

Как уже сказал, что вы сравнение строк не массив. Ваш код должен быть что-то вроде этого (вы должны, вероятно, изменить немного его просто пример)

$checkMsg=strip_tags($_POST['checkMsg']); // message from input form 
$message // message from database 
$MsgWords = preg_split("/[\s,]+/", $checkMsg); 
if(!empty($checkMsg)){ 
    $intersect=array_intersect($message,$MsgWords); 
    if (count($intersect)>1) { 
    //only show output if there are matches 
     echo "Words in common are:<br />"; 
     foreach ($intersect as $Neword) { 
      $Neword = trim($Neword); 
      echo $Neword."<br />"; 
     } 
    } else { 
     echo "There are no words in common"; 
    }  
} 
0

Итак, во-первых, вы перекручивание через два массива и изменение значения, но путь у вас есть это, вы просто изменяете временную копию значения, а не значение в массиве. Чтобы сделать это, вам нужно использовать & знак в foreach() сказать ему, чтобы использовать ссылочную переменную в цикле, как это:

foreach ($MsgWords as &$Neword) { //added the & sign here. 
    $Neword = trim($Neword); 
} 

Сделайте то же самое с другой foreach() петли тоже.

Во-вторых, ваш вызов array_intersect() смотрит на одиночные строки, а не на все массивы. Вам нужно это посмотреть на массивы:

//your incorrect version: 
$intersect=array_intersect($Neword, $currentWord); 

//corrected version, using your variable names. 
$intersect=array_intersect($MsgWords, $word); 

Это должно решить ваши проблемы.

[EDIT]

Кроме того, обратите внимание, что array_intersect() выводит массив (т.е. массив пересечения между двумя входными массивами). Вы не можете использовать echo() для прямой печати массива. Если вы попробуете, он просто покажет слово «Массив». Вы должны преобразовать его в строку первой:

//your incorrect code. 
echo "Your common words are: $intersect"; 

//corrected code: 
echo "Your common words are: ".implode(',',$intersect); 

Я хотел бы также отметить, что ваш стиль кодирования очень грязный и трудно читать. Я настоятельно рекомендую примерить его; следуйте некоторым правилам именования с отступом и переменной. В противном случае это будет очень сложно поддерживать.

+0

Я сделал предложенные изменения, но вышло: «Ваши общие слова:« Массив ». Подобное решение было у меня раньше. – ciccio

+0

@ user2087642 - ваши предложения были правильными; Я сделал редактирование, чтобы показать вам проблему, которую вы все еще имеете. Но эти проблемы являются признаком того, что вы действительно не очень хорошо понимаете PHP и как работают массивы. Я предлагаю потратить некоторое время, чтобы узнать, как это работает, прежде чем пытаться их использовать. – SDC

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