在 PHP 中将一个数组的值连接到另一个数组

Concatenate the values from one array to another in PHP

我正在尝试创建一个函数来生成一组特定字符的所有可能组合,并使其根据长度变化。

我有一个函数可以创建一个我想要的字符数组,而且效果很好。

function generate_characters($l, $n, $d) {
    $r = array();

    if ($l === true) {
        foreach (range('a', 'z') as $index) {
            array_push($r, $index);
        }
    }

    if ($n === true) { array_push($r, '0','1','2','3','4','5','6','7','8','9'); }


    if ($d === true) { array_push($r, '-'); }

    return $r;
}

然后我需要让它根据 $length 创建一个包含所有可能组合的数组,例如如果 '$length = 1' 我需要以下数组

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
    [6] => g
    [7] => h
    [8] => i
    [9] => j
    [10] => k
    [11] => l
    [12] => m
    [13] => n
    [14] => o
    [15] => p
    [.... removed some values to save on length ....]
    [35] => 9
)

但是如果'$length = 2'我需要这个

Array
(
    [0] => aa
    [1] => ab
    [2] => ac
    [3] => ad
    [4] => ae
    [5] => af
    [6] => ag
    [7] => ah
    [8] => ai
    [9] => aj
    [.... removed some values to save on length ....]
    [1329] => 97
    [1330] => 98
    [1331] => 99
)

我尝试了 array_walk() 和 array_walk_recursive(),以及几个 foreach 和 while 循环,但都无济于事。

我可以通过为每个长度手动执行它来让它工作,但不能通过这样做来改变长度,但不知道如何让它按长度变化。

function generate_two($l, $n, $d) {
    $r = array();

    foreach (generate_characters($l, $n, false) as $v1) {
        foreach (generate_characters($l, $n, $d) as $v2) {
            array_push($results, "$v1$v2");
        }
    }
    return $r;
}

虽然我可以在生成数组后删除这些值(如果需要),但没有将“-”作为第一个字符。

谢谢丹

我不知道这是否是最佳解决方案,但是:

function generate_characters($length, $n, $d, $array = array()) {
    $letters = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');
    $numbers = range(0, 9);
    $others = array('-');

    if($n == true)
        $letters = array_merge($letters, $numbers);

    if($d == true)
        $letters = array_merge($letters, $others);


    if(empty($array))
        $array = $letters;

    if(--$length <= 0)
        return $array;

    $result = array();
    foreach ($array as $value) {
        foreach ($letters as $add) {
            $result[] = $value.$add;
        }
    }

    return generate_characters($length, $n, $d, $result);
}

echo '<pre>';
print_r(generate_characters(3, true, true));

如果你想组合两个数组的值,你可以直接使用这段代码。您的函数中不需要该数组的长度。

function generateValue($array1, $array2) {
    $result = array();
    foreach ($array as $value) {
        foreach ($original as $value2) {
            $result[] = $value.$value2;
        }
    }

    return $result;
}
print_r(generateValue($array1, $array2));

示例代码

function generate_characters($l, $n, $d)
{
    // Start with an empty list
    $r = array();

    // Add the letters, if required
    if ($l) {
        $r = array_merge($r, range('a', 'z'));
    }
    // Add the digits, if required
    if ($n) { 
        $r = array_merge($r, range('0', '9'));
    }
    // Add special characters, if required
    if ($d) { 
        $r[] = '-';
    }

    return $r;
}


/**
 * Generate all combinations of $len characters using the characters
 * from a given list
 *
 * @param array $chars  the list of characters to use
 * @param int   $len    the length of strings to generate
 * @return array
 */
function generate_combinations(array $chars, $len)
{
    // $len <= 0: this is an error
    // $len == 1: the input list is the output
    if ($len <= 1) {
        return $chars;
    }

    // Compute the output here
    $result = array();

    // Recursively compute the list of characters of length $len - 1
    $partial = generate_combinations($chars, $len - 1);

    // Append each entry from the input list to each string of length $len - 1 computed on the previous step
    foreach ($partial as $head) {
        foreach ($chars as $tail) {
            // Put the combination in the output list
            $result[] = $head.$tail;
        }
    }

    // This is the list of all strings of length $len over the list $chars
    return $result;
}

用法

无需再一次次调用generate_characters()。给定相同的参数,它总是 returns 相同的字符列表。保存在变量中,进一步使用变量。

$chars = generate_characters(TRUE, FALSE, TRUE);
$comb2 = generate_combinations($chars, 2);
$comb5 = generate_combinations($chars, 5);

备注

虽然理论上是正确的,但生成所有组合在现实生活中完全没有用。组合的数量呈指数增长,很快您的脚本将使用所有可用内存来存储列表。

我测试了上面的代码,PHP5.6 需要超过 2 GB 的内存来生成 5 个字符的所有组合(使用字母 + 破折号)。 PHP 7 使用内存更好,同样的任务需要不到 1 GB 的内存。

如您所想,参数 $len 不可能使用更高的值;即使是$len == 5,上面列出的数额也已经很大了。

假设您要将创建的数组用作要追加到的数组。我不明白为什么你需要使用数组中字符以外的特定字符(我可能错了,但这可以很容易地适应)。

/**
 * @param array $array
 * @param $length
 * @param null $original
 * @return array
 */
function generate_values(array $array, $length, $original = null) {

    // If length is 1 or less just return the array
    if ($length <= 1) {
        return $array;
    }

    // The resulting values array
    $result = [];

    // Copy the array if original doesn't exist
    if (!is_array($original)) {
        $original = $array;
    }

    // Loop over each item and append the original values
    foreach($array as $item) {
        foreach($original as $character) {
            $result[] = $item . $character;
        };
    }

    // Recursively generate values until the length is 1
    return generate_values($result, --$length, $original);
}

要使用它,您可以使用您的发电机。

$characterArray = generate_characters(true, false, false);

$results = generate_values($characterArray, 2);