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

时间:2016-01-20 12:50:29

标签: php arrays concatenation concat string-concatenation

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

我有一个函数可以创建一个我想要的字符数组,这样可以正常工作。

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;
}

所有这些,而没有' - '作为第一个字符,虽然我可以在生成数组后删除这些值,如果需要的话。

谢谢,Dan

4 个答案:

答案 0 :(得分:1)

假设您要使用您创建的数组作为要附加的数组。我不明白为什么你需要使用除阵列之外的特定字符(我可能错了,但这可以很容易地适应以满足这一点)。

pd.merge(df_unstacked, df2, left_index=True, right_on='one')

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

c   [0.018, 0.372]  (0.372, 0.771]  (0.771, 0.995]  one three   two
id                      
1   3.081537    6.329819    3.386422    1   a   2
2   4.270542    2.553301    3.778536    2   a   1
3   3.125476    2.525016    3.013912    3   b   2
4   5.762223    3.763183    7.953551    4   b   2

答案 1 :(得分:0)

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

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));

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

示例代码

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()。给定相同的参数,它总是返回相同的字符列表。将其保存在变量中,进一步使用该变量。

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

说明

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

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

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