На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > Цикл и функция извлечения, переименования, создания массива , опять извлечения данных и объявления переменных
      Опять же вопросы новичка. Умудрился написать длинный код. Много посторочных одинаковых действий. Все работает, только хочется сократить код и сделать его "независимым" от количества полученных переменных. Принцип такой: Получаю из текстового файла массив, выбираю из него определенные значения с ключом [0] значением от нуля и выше, присваиваю им переменные с нумерацией от нуля и выше, создаю новый массив, потом уже готовой функцией его обрабатываю и получаю новые значения. Этим значениям нужно присвоить переменные. Вот код:
      ExpandedWrap disabled
        $BigM=preg_match_all('/()(.*)(\b.*{)/', $block, $mas, PREG_SET_ORDER);
           print preg_match_all('/()(.*)(\b.*{)/', $block, $mas); /* просто посчитать количество входов, выводить на печать не обязательно */  echo '<br>';
        */ Действия ниже хотелось бы записать каким-нибудь циклом и функцией, где максимальное значение второй квадратной скобки равно значению переменной $BigM  */
         
        $m1=$mas[0][0];
        $m2=$mas[0][1];
        $m3=$mas[0][2];
        $m4=$mas[0][3];
        $m5=$mas[0][4];
        $m6=$mas[0][5];
        $m7=$mas[0][6]; */  Тут максимальное значение переменной $BigM */
         
        $mas1=array($m1, $m2, $m3, $m4, $m5, $m6, $m7);
         
        /* Тут некая обработка массива и потом вывод новых результатов чисто для проверки, он не обязательный, можно сразу новым значениям присвоить новые переменные тоже с порядковыми номерами  */
        var_dump($mas1);echo '<br>';
        /* После получения новых значений вручную задаю новые переменные, а хотелось бы автоматизировать */

      Понятно, что начинать по идее нужно с такого:
      ExpandedWrap disabled
        for ($i=0; $i=$BigM; $i++)
        {
        /* Вот тут у меня проблема, не знаю как переименовывать переменные */
        }

      Ну и потом собрать их в массив. К сожалению сразу запихнуть туда значения в виде $mas[0][0] не получается, не идет дальнейшая обработка. Зато в виде $mas1=array($m1, $m2, $m3, $m4, $m5, $m6, $m7); обрабатывает легко, без проблем. И вот новым результатам тоже присваиваю вручную значения, а хотелось бы автоматизировать.
        Собирает mas1 без промежуточной лабуды:

        ExpandedWrap disabled
          $mas[0][0] = "0";
          $mas[0][1] = "1";
          $mas[0][2] = "2";
          $mas[0][3] = "3";
          $mas[0][4] = "4";
          $mas1 = array_values($mas[0]);
          print_r($mas1);

        Этот пример онлайн
          Цитата JoeUser @
          Собирает mas1 без промежуточной лабуды:

          Спс, это не совсем то, что нужно, потому что у всех этих $mas[х][х] уже есть значения с которыми потом нужно производить манипуляции. А в таком виде как у вас, в массив заносятся новые значения 0,1, 2, и тд. С ними нет смысла работать.
          НО я сделал почти как в вашем примере. Сразу:
          ExpandedWrap disabled
            $mas1=array_values($mas[0]);
            print_r($mas1); echo '<br>';

          И отпала необходимость делать массовое присвоение $m1=$mas[0][0] и тд. Ну а дальше уже моя функция по обработке значений. Потом новым значениям нужно будет присвоить новые переменные.
          Теперь бы ещё придумать как автоматизировать и сделать для этого куска.

          В любом случае, спс за наводку )
          Сообщение отредактировано: D-G -
            Цитата D-G @
            А в таком виде как у вас, в массив заносятся новые значения 0,1, 2, и тд. С ними нет смысла работать.

            Неужели не понятно, что эти значения были исключительно для демонстрации использования array_values? :)
              Цитата JoeUser @
              Неужели не понятно, что эти значения были исключительно для демонстрации использования array_values?

              Честно говоря нет )))) ну что ж, туплю )))

              Добавлено
              Теоретически дальше можно было бы извлекать значения и присваивать их переменным с помощью цикла построенного на array_shift пока count не станет равен нулю. Но как автоматически создавать новые переменные? Тоесть код возможно должен выглядеть как-то так:
              ExpandedWrap disabled
                $BigM=preg_match_all('/()(.*)(\b.*{)/', $block, $mas, PREG_SET_ORDER);echo '<br>';
                 
                $mas1=array_values($mas[0]);  /* Создаю массив из полученных с определенным ключом переменных */
                 
                function func()
                {/* Создаю функцию для обработки  */
                }
                array_walk($mas1, 'func'); /* Применяю функцию ко всему новому массиву */
                 
                $count=count($mas1); /* Чисто для проверки количества элементов  */
                for ($i=0; $i=$cont, $count!=0; $i++)
                $izv1=array_shift($mas1); /* Извлекается первый элемент */
                $izv2=array_shift($mas1);
                $izv3=array_shift($mas1);
                $izv4=array_shift($mas1);
                ....
                $izvX=array_shift($mas1); /* Извлекается последний элемент, где Х - максимальное значение count */

              Или есть какая-то стандартная функция для такой задачи?
              Сообщение отредактировано: D-G -
                "Автоматическая генерация" переменных языком PHP не предусмотрена. И, если честно, я не знаю такого языка, где такое возможно. Ибо это какой-то бред! Для одиночного значения есть обычная скалярная переменная, для множеств - есть массивы. Вся эта, извиняюсь, белиберда с извлечением в цикле, возможна ... но зачем? Если можно сделать одним оператором!

                Можно конечно замутить что-то типа:

                ExpandedWrap disabled
                  foreach ($mas[0] as $i) {
                    $mas1[] = $i;
                  }

                Повторюсь, но зачем, если можно проще?
                  Цитата JoeUser @
                  Повторюсь, но зачем, если можно проще?

                  Для создания "динамичного" списка с которым потом будет работать пользователь. В списке значение поля будет равно значению новой переменной, ну или в вашем варианте значению элемента массива. Думалось так будет легче. Можно конечно создавать количество полей в списке по значению count, чтоб не было пустых полей и хватило на все элементы. И надо ж в имени поля выводить индекс элемента, не писать же от руки кучу полей, а потом часть скрывать? Да и боялся запутаться в индексах элементов, мало ли где ещё потом пришлось бы это использовать. А так есть переменная вне массива и делай, тягай её куда хочешь. Хотя возможно вы правы, надо подумать.
                  Сообщение отредактировано: D-G -
                    Цитата D-G @
                    Для создания "динамичного" списка с которым потом будет работать пользователь.

                    При программировании, да и вообще в жизни - рекомендую пользовать сей принцип. Это поможет.
                      Цитата JoeUser @
                      При программировании, да и вообще в жизни - рекомендую пользовать сей принцип. Это поможет.

                      Совершенно согласен. Только для этого нужно видеть несколько способов, а потом уже выбирать самый простой. А я только учусь. Ещё много чего не вижу и не умею, приходится пробовать сперва более сложное, потом упрощать.
                      В принципе я уже почти сделал то, что хотел добиться в этой теме. По крайней мере думал, что добился. Все красиво получалось. Стал я чистить код от лишних проверок и распечаток. Убрал вот эту строку:
                      ExpandedWrap disabled
                         print preg_match_all('/()(.*)(\b.*{)/', $block, $mas); /* просто посчитать количество входов, выводить на печать не обязательно */  echo '<br>';

                      потому что думал, она только для проверки количества найденных элементов. И все перестало работать.
                      Причем, если делаю проверку var_dump($mas), то вроде бы весь массив на месте, только в другом порядке. Было 4 группы по X элементов, стало X групп по 4 элемента. Получается раньше я использовал [0][x], а теперь мне нужно [x][0]. Пробовал вместо array_value array_flip. Может как-то не так, но ничего не получается.
                      Не подскажите в чем может быть проблема?

                      ------------
                      Решил эту проблему. Вместо PREG_SET_ORDER поставил PREG_PATTERN_ORDER
                      Сообщение отредактировано: D-G -
                        Цитата JoeUser @
                        Повторюсь, но зачем, если можно проще?

                        Вы знаете, напробовался и вы правы, все гораздо проще. Чуток попозже покажу свои результаты, может подскажите ещё где можно упростить. А пока, наверно, оставлю тему открытой, хотя в целом более менее понятно и получается.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0338 ]   [ 16 queries used ]   [ Generated: 28.03.24, 16:57 GMT ]