PHP массив собирать - PullRequest
       2

PHP массив собирать

0 голосов
/ 10 июля 2010

У меня есть алфавитный массив из 24 символов: «A B C D E F G H I J K L M N O P Q R S T U V W X»

Я хочу собрать все дела с: 3 уникальными персонажами.

Первый случай: ABC, DEF, GHI, JKL, MNO, PQR, STU, VWX

Ответы [ 3 ]

0 голосов
/ 10 июля 2010

Существует отношение 1: 1 между перестановками букв алфавита и списками ваших наборов.По сути, если у вас есть перестановка алфавита, вам просто нужно позвонить array_chunk, чтобы получить наборы.

Теперь 24!чего-либо (то есть 620448401733239439360000) никогда не поместится в памяти (будь то ОЗУ или диск), поэтому лучшее, что вы можете сделать, это сгенерировать число n между 1 и 24! (номер перестановки), а затем сгенерироватьтакая перестановка.Об этом последнем шаге см., Например, Генерация перестановок после Лемера и Хауэлла и цитируемых там работ.

0 голосов
/ 18 февраля 2015

Это немного поздно, но для всех, кто читает это: Если вы хотите разбить строку на 3-символьные куски, попробуйте встроенную в PHP функцию str_split () . Он принимает аргументы $string и $split_length. Например:

$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWX';
$grouped  = str_split($alphabet, 3);

var_export( $grouped );

Выводит следующий массив:

array ( 0 => 'ABC', 1 => 'DEF', 2 => 'GHI', 
        3 => 'JKL', 4 => 'MNO', 5 => 'PQR', 
        6 => 'STU', 7 => 'VWX', )

Это работает для примера, приведенного в вопросе. Если вы хотите использовать все возможные комбинации этих 24 букв, ответ Артефакто имеет больше смысла.

0 голосов
/ 10 июля 2010
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$c = strlen($alphabet);
$result = array();

for ($i = 0; $i < $c; ++$i) {
    $current0 = $i;
    for ($j = 0; $j < $c; ++$j) {
        if ($current0 == $j) continue;
        $current1 = $j;
        for ($k = 0; $k < $c; ++$k) {
            if (isset($current0 == $k || $current1 == $k)) continue;
            $result[] = $alphabet[$i].$alphabet[$j].$alphabet[$k];
        }
    }
}

Надеюсь, я правильно понял ваш вопрос.Этот перебирает алфавит в трех циклах и всегда пропускает символы, которые уже используются.Затем я помещаю результат в $ result.

Но лучше попробуйте скрипт только с пятью буквами;) Использование alls strlen ($ alphabet) (не хочу считать сейчас ...) потребует невероятно много памяти.

(я уверен, что есть какая-то хакерская версия, которая быстрее этой, но я думаю, что это очень просто.)

...