Как можно обработать ключи в массиве PHP?

Здравствуйте. <br/><br/> У меня есть задача, связанная с обработкой набора фраз: <br/><br/> <i>Honda, Honda CRF, Honda CRF-450X<br/> Владивосток, Приморский край - Владивосток<br/> продажа, покупка, цена, с пробегом</i> <br/><br/> Мне нужно разделить эти фразы по переносу строки и запятой, чтобы получить два массива: <br/> 1. Массив строк; <br/> 2. Массив слов, разделённых запятой. <br/><br/> Затем, каждое слово из второго массива нужно дополнительно разбить по пробелам, что в итоге даст три массива. <br/><br/> Также существует требование, чтобы фразы не пересекались по ключам. Например:<br/><br/> <b>Honda <br/> Honda CRF <br/> Honda CRF 450X <br/></b> <br/><b>Эти фразы перекрывают друг друга и должны быть «разминусованы» следующим образом:</b><br/><br/> Honda -CRF -450X <br/> Honda CRF -450X <br/> Honda CRF 450X <br/><br/> Пожалуйста, объясните, как должен работать алгоритм для этой задачи. Уточню, что набор слов может быть различным, и они могут как пересекаться, так и не пересекаться. <br/><br/> У меня была идея отсортировать второй массив. Взять первый элемент за ключ. Как следует действовать дальше? Что делать, если одно слово из массива выделяется среди остальных, а остальные соответствуют условиям?
  • 1 февраля 2025 г. 8:24
Ответы на вопрос 2
Чтобы решить вашу задачу, давайте разобьем её на несколько шагов. Мы будем использовать PHP для обработки строк, разделения их на массивы и удаления пересечений между фразами.

### Шаги алгоритма:

1. **Исходная строка**: Сначала вам нужна исходная строка, содержащая фразы.

2. **Разделение по строкам**: Используйте `explode()` для разделения фраз по переносу строки, чтобы получить массив строк.

3. **Разделение по запятой**: Для каждой строки в массиве строк, используйте `explode()` снова, чтобы получить массив слов, разделенных запятой.

4. **Обработка пересечений**: Напишите функцию, которая будет проверять пересечения между фразами, и «разминусует» их, удаляя несущественные подстроки:

    - Для каждой фразы, которая содержит другие фразы в качестве подстрок, вы можете использовать функцию `strpos()` для проверки наличия подстрок.
    - Если одна фраза является подстрокой другой, она должна быть удалена или «разминусована».

5. **Результирующие массивы**: В итоге вы получите три массива: массив фраз, массив слов и массив слов, дополнительно разбитый по пробелам.

### Пример реализации на PHP:

```php
<?php

$inputString = "Honda, Honda CRF, Honda CRF-450X\nВладивосток, Приморский край - Владивосток\nпродажа, покупка, цена, с пробегом";

// 1. Разделение строк
$lines = explode("\n", $inputString);

// 2. Разделение по запятой и создание массивов
$phraseArray = [];
$wordArray = [];

foreach ($lines as $line) {
    $phrases = explode(',', $line);
    foreach ($phrases as $phrase) {
        $trimmedPhrase = trim($phrase);
        if (!empty($trimmedPhrase)) {
            $phraseArray[] = $trimmedPhrase;
            $words = explode(' ', $trimmedPhrase);
            foreach ($words as $word) {
                $wordArray[] = $word;
            }
        }
    }
}

// 3. Удаление пересечений
function removeOverlaps($phrases) {
    $result = [];
    foreach ($phrases as $phrase) {
        $isOverlapping = false;
        foreach ($phrases as $compare) {
            if ($phrase !== $compare && strpos($compare, $phrase) !== false) {
                $isOverlapping = true;
                break;
            }
        }
        if (!$isOverlapping) {
            $result[] = $phrase;
        }
    }
    return $result;
}

$uniquePhrases = removeOverlaps($phraseArray);

// 4. Разделение слов по пробелам
$finalWordArray = [];
foreach ($uniquePhrases as $phrase) {
    $words = explode(' ', $phrase);
    foreach ($words as $word) {
        if (!in_array($word, $finalWordArray)) {
            $finalWordArray[] = $word;
        }
    }
}

// Результаты
print_r($uniquePhrases);
print_r($wordArray);
print_r($finalWordArray);

?>
```

### Пояснение к коду:

1. **Исходная строка**: Мы объявили переменную `$inputString` с исходными фразами.

2. **Разделение по строкам и запятой**: Сначала мы разбиваем строки, а затем разбиваем каждую строку по запятой, собирая фразы и слова.

3. **Удаление пересечений**: Функция `removeOverlaps()` проверяет, является ли одна фраза подстрокой другой, и создает массив с уникальными фразами.

4. **Разделение слов по пробелам**: Создается финальный массив слов из уникальных фраз.

Теперь у вас есть три массива: массив уникальных фраз, массив всех слов и массив уникальных слов. Вы можете использовать их по своему усмотрению.
<pre><code class="php">$largest = [];

            foreach ($this-&gt;keywords[$a] as $key =&gt; $arr) {

                for ($c = 0; $c &lt; count($this-&gt;keywords[$a]); $c++) {
        
                    $k = array_search($arr[0], $this-&gt;keywords[$a][$c]);

                    if ($k !== false &amp;&amp; $c != $key) {

                        if (count($this-&gt;keywords[$a][$c]) &gt; count($largest)) {

                            $largest = $this-&gt;keywords[$a][$c];

                        }

                    }
                
                }

            }

            foreach ($this-&gt;keywords[$a] as $key =&gt; $arr) {

                foreach($largest as $add_word){

                    if(!in_array($add_word, $arr)){

                        $this-&gt;keywords[$a][$key][] = '-'.$add_word;

                    }

                }

            }</code></pre>
Похожие вопросы