Эффективный способ создания массива массива с использованием массива и ассоциативного массива в php - PullRequest
3 голосов
/ 25 мая 2019

У меня есть такой массив:

$word=['total','sales']

и ассоциативный массив, подобный этому:

$tot = ['1'=>array('count','total','num of','no of', 'no. of'),
        '2'=>array('count')];

1 означает, что его можно использовать до

2 означает, что его можно использовать после

Мне нужно заменить слово, которое присутствует как в $ word, так и в $ tot, и заменить это слово на все остальные слова, которые есть в $ tot. Положение определяется по вышеуказанному правилу.

Я хочу, чтобы все комбинации в массиве массивов были такими:

[['count', 'sales'],
['sales', 'count'],
['total', 'sales'],
['num of', 'sales'],
['no. of', 'sales'],
['no of', 'sales']]

Есть ли эффективный способ сделать это в PHP?

PS: - Если переменная $ word является любой из них, выходные данные должны быть одинаковыми: -

['count','sales']
['sales','count']
['no of','sales']

PS2: - В основном, если $ word - это любой элемент выходного массива. Я хочу, чтобы все остальные элементы в выходном массиве.

1 Ответ

1 голос
/ 25 мая 2019

Вот функция, которая, я думаю, будет делать то, что вы хотите. Требуется список слов и список синонимов. Первое и последнее слова обрабатываются и, если они существуют в списке синонимов, заменяются (либо в начале, либо в конце строки, в зависимости от индекса в массиве синонимов).

function swap_words($words, $synonyms) {
    $all_synonyms = array_unique(array_merge(...$synonyms));

    $result = [];
    $word = $words[0];
    if (in_array($word, $all_synonyms)) {
        foreach ($synonyms[1] as $replacement) {
            $result[] = "$replacement " . implode(' ', array_slice($words, 1));
        }
        foreach ($synonyms[2] as $replacement) {
            $result[] = implode(' ', array_slice($words, 1)) . " $replacement";
        }
    }

    $c = count($words) - 1;
    $word = $words[$c];
    if (in_array($word, $all_synonyms)) {
        foreach ($synonyms[1] as $replacement) {
            $result[] = "$replacement " . implode(' ', array_slice($words, 0, $c));
        }
        foreach ($synonyms[2] as $replacement) {
            $result[] = implode(' ', array_slice($words, 0, $c)) . " $replacement";
        }
    }

    return $result;
}

Использование:

$words = ['no of', 'autumn', 'sales'];
$tot = ['1'=>array('count','total','num of','no of', 'no. of'),
        '2'=>array('count')];
print_r(swap_words($words, $tot));

$words = ['autumn', 'sales', 'count'];
print_r(swap_words($words, $tot));

В обоих случаях вывод

Array (
  [0] => count autumn sales
  [1] => total autumn sales
  [2] => num of autumn sales
  [3] => no of autumn sales
  [4] => no. of autumn sales
  [5] => autumn sales count
)

Демонстрация на 3v4l.org

...