• Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @eandr_67 я думаю не обязательно использовать сортировку usort суть в том что сортировка как тут подходит.
    $result = generate( preg_split("-[\W]-u", $a, -1, PREG_SPLIT_NO_EMPTY));
    	print_r($result);
    	 
    	function generate($inp){
    	  $out=array(implode(' ', $inp));
    	  $tail=array();
    	  while(count($inp)>1){
    		array_unshift($tail, array_pop($inp));
    		foreach(generate($tail) as $val){
    		  $out[]=array_merge(array(implode(' ', $inp)), (array)$val);
    		}
    	  }
    	  return $out;
    	}

    проблема возникает когда появляются 4 слова в переменной
    например напишем 1 2 3 4
    У нас выводит
    Array
    (
        [0] => 1 2 3 4
        [1] => Array
            (
                [0] => 1 2 3
                [1] => 4
            )
    
        [2] => Array
            (
                [0] => 1 2
                [1] => 3 4
            )
    
        [3] => Array
            (
                [0] => 1 2
                [1] => 3
                [2] => 4
            )
    
        [4] => Array
            (
                [0] => 1
                [1] => 2 3 4
            )
    
        [5] => Array
            (
                [0] => 1
                [1] => 2 3
                [2] => 4
            )
    
        [6] => Array
            (
                [0] => 1
                [1] => 2
                [2] => 3 4
            )
    
        [7] => Array
            (
                [0] => 1
                [1] => 2
                [2] => 3
                [3] => 4
            )
    
    )

    возьмем например просто 1 2 3
    Получаем
    Array
    (
        [0] => 1 2 3
        [1] => Array
            (
                [0] => 1 2
                [1] => 3
            )
    
        [2] => Array
            (
                [0] => 1
                [1] => 2 3
            )
    
        [3] => Array
            (
                [0] => 1
                [1] => 2
                [2] => 3
            )
    
    )
    Идеально работает
    Нужно вставить какую то дополнительную проверку при комбинации в 4 слова, или разбить текст с двух сторон, если такое возможно.

    Пытался найти подобие
    array_unshift — Добавляет один или несколько элементов в начало массива
    array_push — Добавляет один или несколько элеметов в конец массива
    array_shift — Извлекает первый элемент массива
    array_pop — Извлекает последний элемент массива

    только так — Добавляет один или несколько элеметов в начало и в конец массива
    только так 2 — Извлекает последний и первый элемент массива

    Пытался сделать сразу двойную разбивку, пока не получается интегрировать array_unshift и array_push
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @eandr_67 немного не так сортирует, например
    [128] => Array
            (
                [0] => 1
                [1] => 2 3 4 5 6 7 8 9

    находиться на 128 строке
    хотя должен быть после
    [1] => Array
            (
                [0] => 1 2 3 4 5 6 7 8
                [1] => 9
            )

    Кстати хотел еще узнать, какой у вас стаж в программирование на php?
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor usort это отдельный элемент нужно создавать?
    Ну типа вторую функцию и скрещивать ее с этим кодом.

    Может можно рекурсию настроить, что-бы он порядок не нарушал?
    Так будет быстрей вроде работать.
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @eandr_67 у меня еще вопрос, возможно нужно будет создать новую тему, я пока не знаю.

    Нужно распределитель порядок каждого массива.
    Например - текст который имеет больше слов в массиве должен быть первый.

    Самый верхний, самый первый массив
    [0] => Array
    		(
    			[0] => Шла саша по шоссе и сосала сушку
    		)


    Самый нижний, самый последний массив
    [40] => Array
    		(
    			[0] => Шла
    			[1] => саша
    			[2] => по
    			[3] => шоссе
    			[4] => и
    			[5] => сосала
    			[6] => сушку
    		)


    Возможно нужно будет самим распределять порядок, прокомментируете кусочек кода который отвечает за это.

    Еще хотел узнать, код разбирает все варианты которые могут быть или только определенные?
    Например - если текст будет составлять 50 слов, он разберет все варианты?
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor вы можете доделать свой вариант, он более продвинутый и подбирает почти все варианты.
    И в нем очень много недоработок :D
    Я не смогу доделать.
    $a5 = "Шла саша по шоссе и сосала сушку"; // переменная с текстом
    
    function mergeResult($a, $b, $needJoin = true) {
    	// fixme: увы не хватает времени на допилку...
        if (!$needJoin) return array_merge($a, $b);
        return array_map(function ($r) use ($a) {
            return mergeResult($a, $r, false);
        }, $b);
    }
     
    function buildLevel(array $words, $level) {
        // с первым уровнем все просто
        if ($level === 1) return [implode(' ', $words)];
     
        // со вторым чуть по сложнее...
        $result = [];
        $chunk = [];
        while(count($words) >= $level) {
            // отделяем первое слово из "строки" и зановим его к первому "слагаемому"
            array_push($chunk, array_shift($words));
            $result[] = mergeResult(buildLevel($chunk, 1), buildLevel($words, $level-1), $level > 2);
        }
    	return $result;
    }
     
    $words = preg_split("-[\W]-u", $a5, -1, PREG_SPLIT_NO_EMPTY);
    
    // я торопился по сему вот так...
    
    $r = [];
    for($i=1;$i<count($words);$i++) {
        $r = array_merge($r, buildLevel($words, $i));
    }
    
    print_r($r);
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    нужны просто все комбинации, которые можно сделать с текстом
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @eandr_67 увидел одну мелкую недоработку
    код не создает комбинации такого вида, как можно исправить?
    [17] => Array
            (
                [0] => 1 2
                [1] => 3 4
                [2] => 5 6
                [3] => 7 8

    и комбинации такого вида

    [17] => Array
            (
                [0] => 1 2 3
                [1] => 4 5 6
                [2] => 7 8 9
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor а почему он создает массив внутри массива, можно это как то убрать?
    [20] => Array
            (
                [0] => Array
                    (
                        [0] => Шла саша
                        [1] => Array
                            (
                                [0] => по
                                [1] => Array
                                    (
                                        [0] => шоссе
                                        [1] => Array
                                            (
                                                [0] => и
                                                [1] => сосала
                                                [2] => сушку
                                            )
    
                                    )
    
                            )
    
                    )
    
            )
    
    )

    И еще как можно очередность сбалансировать, например первое это
    [0] => Array
    		(
    			[0] => Шла саша по шоссе и сосала сушку
    		)

    А последняя, полностью разобранный текст
    [40] => Array
    		(
    			[0] => Шла
    			[1] => саша
    			[2] => по
    			[3] => шоссе
    			[4] => и
    			[5] => сосала
    			[6] => сушку
    		)
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor мне нужно отделить символы от текста и при этом записать их отдельно, хотя позже я подумал их вовсе убирать
    $b = preg_split('-([\W])-u', $a, -1, PREG_SPLIT_NO_EMPTY);

    но точно я еще не решил, нужны мне они или нет.
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor с этим я разобрался
    $words = preg_split('-([\W])-u', $a, -1, PREG_SPLIT_NO_EMPTY);

    но заменить это print_r(buildLevel($words, 1)); на что то другое, я наверно не смогу.

    Суть в том что текста в переменной $a может быть неограниченное количество
    print_r($c); должна быть один, что означает что все массивы в одной переменной
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    Хотел еще попробовать так
    $arWords = preg_split("-([\W])-u", $a, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    только он пробелы создает, странно.
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    Не все варианты алгоритмов показывает, например нету
    [40] => Array
    		(
    			[0] => Шла
    			[1] => саша
    			[2] => по
    			[3] => шоссе
    			[4] => и
    			[5] => сосала
    			[6] => сушку
    		)
    )

    А так очень, очень близко, еще не получается добавить
    $b = preg_split('-([\W])-u', $a, -1, PREG_SPLIT_NO_EMPTY); // супер-пупер разделитель текста
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @HaveFun да это я и есть :D
    Там не получилось вот новую тему открыл, все не как решить не могу с этим долбаным кодом:)
    А если точнее, я уже открывал 5 раз эту тему, один раз даже картинку сделал, мне сказали тебе надо к математикам идти а не к программистам :)
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor обновил php
    немного разобрался сделал чет в этом роде
    $a = "Шла саша по шоссе и сосала сушку"; // переменная с текстом
    
    function mergeResult($a, $b, $needJoin = true) {
    	// fixme: увы не хватает времени на допилку...
        if (!$needJoin) return array_merge($a, $b);
        return array_map(function ($r) use ($a) {
            return mergeResult($a, $r, false);
        }, $b);
    }
     
    function buildLevel(array $words, $level) {
        // с первым уровнем все просто
        if ($level === 1) return [implode(' ', $words)];
     
        // со вторым чуть по сложнее...
        $result = [];
        $chunk = [];
        while(count($words) >= $level) {
            // отделяем первое слово из "строки" и зановим его к первому "слагаемому"
            array_push($chunk, array_shift($words));
            $result[] = mergeResult(buildLevel($chunk, 1), buildLevel($words, $level-1), $level > 2);
        }
    	return $result;
    }
     
    $words = explode(' ',$a);
    // я торопился по сему вот так...
    print_r(buildLevel($words, 1));
    print_r(buildLevel($words, 2));
    print_r(buildLevel($words, 3));
    print_r(buildLevel($words, 4));
    print_r(buildLevel($words, 5));
    print_r(buildLevel($words, 6));
    print_r(buildLevel($words, 7));

    но меня убивает этот код print_r(buildLevel($words, 9));
    Тут наверно надо как то цикл сделать, чтоб не писать постоянно эти строчки
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor Я попробую доделать, просто я не понимаю как он работает.
    Конечный результат это конечно хорошо, ибо мне еще куча всего нужно делать, плюс с конечным результатом можно быстро понять как работает код и быстро допилить дополнительный функционал.
    Еще если вам трудно доделать его и у вас он займет много времени, то я вообще не чего не смогу сделать у меня опыта мало.
    если вы еще с php5.3 работаете - немедленно обновитесь.
    Я на Денвере проверяю, наверно надо обновить.

    И что вы имеете в виду под "нестандартно".
    То что я не вижу переменную с текстом и разделитель текста не используется
    $b = preg_split('-([\W])-u', $a, -1, PREG_SPLIT_NO_EMPTY);
    я так понимаю у вас в коде разделяется текст через пробел, если даже он будет работать, как он будет разделять символы типа !"№;%;? или он их просто отсеет.
    Вы не думаете что я не буду разбирать ваш код, просто я делаю все по порядку иначе я в край запутаюсь.
    P.S. В идеале мне бы лучше комментировать каждую строчку.
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    @Fesor чет он как-то не стандартно сделан, других способов реализации нету? :)
    У меня еще он выдает ошибку синтаксиса, вот тут if ($level === 1) return [implode(' ', $words)];
  • Как собрать многоуровневый массив?

    Xakephp
    @Xakephp Автор вопроса
    я уже как месяц пытаюсь это сделать :D