在 php 中使用数组和关联数组创建数组数组的有效方法

Efficient way of creating array of array using an array and associative array in php

我有一个这样的数组:

$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 是输出数组的任何元素。我想要输出数组中的所有其他元素。

这是一个我认为可以满足您要求的函数。它需要一个单词列表和一个同义词列表。处理第一个和最后一个单词,如果它们存在于同义词列表中则被替换(在字符串的开头或结尾,取决于同义词数组中的索引)。

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
)

Demo on 3v4l.org