Как удалить дубликаты из многомерного массива после поиска preg_match_all? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь удалить дубликаты из многомерного массива. Я прочитал несколько связанных вопросов и попытался адаптировать метод super_unique, но он не работает.

Я генерирую результаты из базы данных, используя preg_match_all, чтобы найти текстовый шаблон. Проблема в том, что preg_match_all дает мне новую запись в массиве для каждого совпадения, но я хочу только одну. (Я попытался переключиться на preg_match, но не смог заставить его работать.) Я прочитал обсуждение дедупликации здесь, и с этого я попробовал следующий код, но он все еще сохраняет дублированный.

$query = "SELECT shortword,word,essay,definitions FROM lexicon;";
$result = mysql_query($query) or die("Query failed : " . mysql_error());
$num_results = mysql_num_rows($result);

$results = array();
for ($i = 0; $i < $num_results; $i++) {
    $row = mysql_fetch_array($result);
    $newtext=   $row["essay"]." ".$row["definitions"];
    if (preg_match_all("/(\<i\>U\<\/i\>|U) $episodenav\D/", $newtext, $matches)) {
        foreach ($matches[0] as $match) {
            $match = ltrim(strip_tags($match), "U ");
            // array pseudo key is the float value of $match
            // add '_key' member for usort()
            $row['_key'] = floatval($match);
            $results[] = $row;
        }
    }
}

function super_unique($results) {
  $result = array_map("unserialize", array_unique(array_map("serialize", $results)));

  foreach ($result as $key => $value)
  {
    if ( is_array($value) )
    {
      $result[$key] = super_unique($value);
    }
  }

  return $result;
}

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

Включение реальных данных было бы немного ошеломляющим, но я попытаюсь смоделировать это. Скажем, $ episodenav равен 12, и одна строка базы данных выглядит как

shortword = "гордость" слово = "гордость и предубеждение" essay = "Это эссе о Гордости и Предубеждении (U 12), в котором есть цитаты в формате, который будет выбран preg_match_all дважды (U 12)." Definition = "Группа определений, которые также могут иметь цитаты, соответствующие поиску preg_match_all (U 12)."

Таким образом, после поиска preg_match_all в моем массиве будет три записи для shortword = "pride", и я хочу создать список, содержащий запись, основанную на каждом коротком слове. Это заканчивается на этом шаге:

// ... then display stuff in order
foreach($results as $row) {
    $row['_key'] = number_format((float)$row['_key'], 0, '', '');    echo '<p class="textmark_result">' . (string)$row['_key'] . ' (episode as whole)';
    echo '  <a href="../Pivot/lexiconentry.php?shortword=' 
. $row["shortword"] . '">' . $row["word"] . '</a>';
    echo "</p>\n";

С текущим кодом я получаю три записи для "гордости", но я хочу только одну.

...