2014-01-08 1 views
0

У меня есть запрос к базе данных, которая вытаскивает строки текстаКак я могу удалить повторяющиеся слова из массивов?

$descriptionsQuery = mysql_query("select prob_text from opencall where logdatex between $OneHourAgo and $TimeNow ORDER by callref DESC") or die(mysql_error()); 
$descriptions = array(); 

while ($row = mysql_fetch_assoc($descriptionsQuery)){ 
$descriptions[] = $row['prob_text']; 
} 
//put all the strings together with a space between them 
$glue = implode (" ",$descriptions); 

Что я хотел помочь с это ... до того, как «описание []» «приклеено», чтобы быть одной длинной строки, я m желая удалить дубликаты слов. Когда они склеиваются, я полагаюсь на то, что из каждого оригинального описания повторяются слова. Трудно объяснить, вот пример того, что я имею в виду. 2 пользователя вводят некоторый текст, например User1: "I have an issue with Leeds server. I am in Leeds" User2: "Margaret in Leeds has a problem, please call margaret". Из этого я хотел бы, чтобы User1 имел только 1 «Leeds» в финальной склеенной строке, User2 имеет только 1 маргарет, но оба пользователя упоминают «Leeds», поэтому я хотел бы, чтобы он дважды был в склеенной строке, один раз от каждого пользователя. Это возможно? Любая помощь оценивается.

+0

http://uk3.php.net/function.array-unique – putvande

+0

Почему бы просто не изменить ваш SQL-запрос на 'SELECT DISTICT prob_text FROM opencall'? –

+0

Оставьте mysql_ и перейдите к mysqli_. Это вопрос времени, прежде чем mysql_ будет сброшен PHP. – Mave

ответ

5

Вы можете сделать это с помощью $newarray = array_unique($oldarray).

Сначала взорвите каждую из своих строк, чтобы получить массив. Используйте array_unique() для удаления дубликатов. Затем взорвите каждую из своих строк, а затем взорвите их все.

$descriptionsQuery = mysql_query("select prob_text from opencall where logdatex between $OneHourAgo and $TimeNow ORDER by callref DESC") or die(mysql_error()); 
$descriptions = array(); 

while ($row = mysql_fetch_assoc($descriptionsQuery)){ 
    $tmp = explode(' ', $row['prob_text']); 
    $tmp = array_unique($tmp); 
    // or case insensitive 
    // $tmp = array_intersect_key($array,array_unique(array_map(strtolower,$array))); 
    $descriptions[] = implode(' ', $tmp); 
} 
//put all the strings together with a space between them 
$glue = implode (" ",$descriptions); 

http://de3.php.net/function.array-unique

Если вы хотите удалить дубликаты в регистронезависимом образом, вы должны изменить вторую строку в то время. Я нашел советы здесь: Best solution to remove duplicate values from case-insensitive array

+0

Это чувствительно к регистру, поэтому Маргарет и Маргарет будут в финальной строке – Mathew

+0

отлично, спасибо! – Maff

+0

Я добавил редактирование для нечувствительного к регистру. – Guilro

1

Лучше сделать это в запросе.

Вы могли бы сделать что-то вроде

SELECT DISTINCT prob_text FROM opencall WHERE logdatex BETWEEN $OneHourAgo AND $TimeNow ORDER BY callref DESC 

Это будет только выбрать слово один раз в вашей базе данных, так что вы не будете выбирать любые дубликаты.

http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html

+1

Это не вопрос: / – Guilro

0

использование array_unique. или использовать DISTINCT в запросе

$descriptionsQuery = mysql_query("select prob_text from opencall where logdatex between $OneHourAgo and $TimeNow ORDER by callref DESC") or die(mysql_error()); 
$descriptions = array(); 

while ($row = mysql_fetch_assoc($descriptionsQuery)){ 
$descriptions[] = $row['prob_text']; 
} 

//remove duplicates: 
$descriptions = array_unique($descriptions); 

//put all the strings together with a space between them 
$glue = implode (" ",$descriptions); 
0

кажется, хорошее время, чтобы использовать array_walk и anonymous functions. Это позволит отфильтровать все повторяющиеся слова в одном сообщении, игнорируя случай:

// $chat is the db result array 
foreach($chat as &$msg) { 
    $final = []; 
    array_walk(str_word_count($msg, 1), function($word) use (&$final) { 
     if (!in_array(strtolower($word), array_map('strtolower', $final))) { 
      $final[] = $word; 
     } 
    }); 
    $msg = implode(' ', $final); 
});   
$filtered = implode(' ', $chat); 

Обратите внимание на использование str_word_count(), а не explode(). Я не тестировал это в производственном env, но он будет пропускать базовую пунктуацию (кроме ' и -); может быть полезно, когда вы пытаетесь создать облако тегов.

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