#php #arrays #combinations #memory-limit
#php #массивы #комбинации #ограничение памяти
Вопрос:
Я пытаюсь создать функцию для генерации всех возможных комбинаций. Эта часть работает хорошо, поэтому вывод будет
aaa aab aac aad …
Но теперь я пытаюсь добавить расширение к каждой из комбинаций, поэтому я хочу добавить «ПРИВЕТ» в конце, например
аааХИ аабХИ Аачи аадХИ
Я попробовал следующее, но получаю эту ошибку. Есть ли лучший способ сделать это, чем то, что я делаю?
Фатальная ошибка: разрешенный объем памяти 268435456 байт исчерпан (пытался выделить 100663409 байт)
вот мой скрипт
function sampling($chars, $size, $combinations = array()) {
# if it's the first iteration, the first set
# of combinations is the same as the set of characters
if (empty($combinations)) {
$combinations = $chars;
}
# we're done if we're at size 1
if ($size == 1) {
return $combinations;
}
# initialise array to put new values in
$new_combinations = array();
# loop through existing combinations and character set to create strings
foreach ($combinations as $combination) {
foreach ($chars as $char) {
$new_combinations[] = $combination. $char;
$new_combinations[] = implode($new_combinations, "HI");
}
}
# call same function again for the next iteration
return sampling($chars, $size - 1, $new_combinations);
}
// example
$chars = 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');
$output = sampling($chars, 3);
foreach($output as $do)
{
echo $do."<br>";
}
Комментарии:
1. Либо используйте функции set_ini, либо откройте php.ini и увеличьте допустимый объем памяти. Подумайте, почему вам действительно нужно это сделать, прежде чем увеличивать размер.
2. iv пробовал это, но он все еще не работает
3. Какой размер массива вы пытаетесь создать?
4. если я не использую $new_combinations[] = implode($new_combinations, «HI»); он работает нормально. Но если я добавлю эту строку, это не сработает
5. Ваш массив $new_comninations постепенно растет. Потому что вы берете все комбинации на предыдущей итерации и добавляете их на следующей. Конечно, у вас заканчивается память. Просто не делайте этого.
Ответ №1:
Это не совсем понятно, что вы собираетесь делать, но, во-первых, вы используете implode()
неправильно. Первым аргументом должен быть $glue, а вторым — ваш массив.
string implode ( string $glue , array $pieces )
Во-вторых, ваш массив $ new_combinations постепенно растет на каждом шаге.
Но если я понял, что вы собираетесь делать, будет ли этот код работать для вас:
<?php
function sampling($chars, $size, $combinations = array()) {
// if it's the first iteration, the first set
// of combinations is the same as the set of characters
if (empty($combinations)) {
$combinations = $chars;
}
// we're done if we're at size 1
if ($size == 1) {
return $combinations;
}
// initialise array to put new values in
$new_combinations = array();
// loop through existing combinations and character set to create strings
foreach ($combinations as $combination) {
foreach ($chars as $char) {
$tmp = $combination. $char;
if ($size == 2) {
$tmp .= '.com';
}
$new_combinations[] = $tmp;
// I don't get what you were going to do with this line,
// but this looks like a logical bug in your code
//$new_combinations[] = implode(".com", $new_combinations);
}
}
// call same function again for the next iteration
return sampling($chars, $size - 1, $new_combinations);
}
// example
$chars = 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');
$output = sampling($chars, 3);
foreach($output as $do)
{
echo $do."<br>".PHP_EOL;
}
Комментарии:
1. спасибо, я попробовал это, но его отображение выглядит так «aa.coma.com » вместо того , чтобы «aa.com »