在 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);
我正在尝试创建一个函数来生成一组特定字符的所有可能组合,并使其根据长度变化。
我有一个函数可以创建一个我想要的字符数组,而且效果很好。
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);