Это конкретный вариант часто повторяющегося вопроса, но, как бы я ни старался, я не мог найти эту точную ситуацию в любом месте Stack Overflow.Не повторяющаяся комбинация конкретного счета в PHP
Короче говоря, я хочу взять массив так:
$days[0] = 'Monday';
$days[1] = 'Tuesday';
$days[2] = 'Thursday';
(. $ Дней может содержать любое количество и сочетание пяти рабочих дней недели)
И затем, с учетом определенного значения $numberOfDays
(который, конечно, должен быть не менее 1 и не более, чем счет $days
), мне нужен массив, содержащий все возможные комбинации $ days с числом $ numberOfDays дней.
Например:
$days[0] = 'Monday';
$days[1] = 'Tuesday';
$days[2] = 'Thursday';
$numberOfDays = 2;
$dayCombinations = getDayCombinations($days, $numberOfDays);
Выход:
$dayCombinations[0] = array("Monday", "Tuesday");
$dayCombinations[1] = array("Monday", "Thursday");
$dayCombinations[2] = array("Tuesday", "Thursday");
Обратите внимание, что эти комбинации, а не перестановки, так что порядок не имеет значения.
Если это поможет, я нашел эту функцию here: Он хорошо работает, но включает в себя повторы и базируется строки вместо массива (что последняя часть является работоспособным, не имеет большого значения, но повторы часть действительно беспорядок для меня).
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;
}
}
# call same function again for the next iteration
return sampling($chars, $size - 1, $new_combinations);
}
UPDATE: Я пытался обернуть строку присваивая $new_combinations
с условной, чтобы помочь; это не имело никакого эффекта, хотя я не уверен, почему. Все комбинации все еще проходят, даже с повторениями.
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) {
if (strpos($combination, $char) === FALSE) {
echo "Char $char not found in Combination $combination<br>";
$new_combinations[] = $combination . $char;
}
}
}
# call same function again for the next iteration
return sampling($chars, $size - 1, $new_combinations);
}
Выход там возвращает странности, как:
Char 2 not found in Combination 2
Char 3 not found in Combination 23
И так далее.
Спасибо за помощь!
Alex
что вы имеете в виду повторения? Дублирует правильно. Вы можете попробовать 'array_unique ($ dayCombinations)', чтобы удалить их, не будучи уверенным, что он работает с массивами в качестве значения. Или другим способом использовать комбинацию в качестве ключа, например '$ dayCombinations ['Monday-Tuesday'] = array (« Понедельник »,« Вторник »);« тогда они естественным образом уникальны, пока дни находятся в одном и том же порядок для ключа. – ArtisticPhoenix
Добавьте 'if (! In_array ($ item, $ сочетание))' вокруг '$ new_combinations []' назначение. – Barmar
Бармар, я на самом деле пытаюсь это прямо сейчас. Внутри функции выборки $ сочетание и $ char являются строками, поэтому я пытаюсь использовать strpos. Хотя по какой-то причине это не удавалось. Сейчас я обновляю главный пост, чтобы отразить его. –