Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.8.247] |
|
Сообщ.
#1
,
|
|
|
Опять же вопросы новичка. Умудрился написать длинный код. Много посторочных одинаковых действий. Все работает, только хочется сократить код и сделать его "независимым" от количества полученных переменных. Принцип такой: Получаю из текстового файла массив, выбираю из него определенные значения с ключом [0] значением от нуля и выше, присваиваю им переменные с нумерацией от нуля и выше, создаю новый массив, потом уже готовой функцией его обрабатываю и получаю новые значения. Этим значениям нужно присвоить переменные. Вот код:
$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>'; /* После получения новых значений вручную задаю новые переменные, а хотелось бы автоматизировать */ Понятно, что начинать по идее нужно с такого: for ($i=0; $i=$BigM; $i++) { /* Вот тут у меня проблема, не знаю как переименовывать переменные */ } Ну и потом собрать их в массив. К сожалению сразу запихнуть туда значения в виде $mas[0][0] не получается, не идет дальнейшая обработка. Зато в виде $mas1=array($m1, $m2, $m3, $m4, $m5, $m6, $m7); обрабатывает легко, без проблем. И вот новым результатам тоже присваиваю вручную значения, а хотелось бы автоматизировать. |
Сообщ.
#2
,
|
|
|
Собирает mas1 без промежуточной лабуды:
$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); Этот пример онлайн |
Сообщ.
#3
,
|
|
|
Цитата JoeUser @ Собирает mas1 без промежуточной лабуды: Спс, это не совсем то, что нужно, потому что у всех этих $mas[х][х] уже есть значения с которыми потом нужно производить манипуляции. А в таком виде как у вас, в массив заносятся новые значения 0,1, 2, и тд. С ними нет смысла работать. НО я сделал почти как в вашем примере. Сразу: $mas1=array_values($mas[0]); print_r($mas1); echo '<br>'; И отпала необходимость делать массовое присвоение $m1=$mas[0][0] и тд. Ну а дальше уже моя функция по обработке значений. Потом новым значениям нужно будет присвоить новые переменные. Теперь бы ещё придумать как автоматизировать и сделать для этого куска. В любом случае, спс за наводку ) |
Сообщ.
#4
,
|
|
|
Цитата D-G @ А в таком виде как у вас, в массив заносятся новые значения 0,1, 2, и тд. С ними нет смысла работать. Неужели не понятно, что эти значения были исключительно для демонстрации использования array_values? |
Сообщ.
#5
,
|
|
|
Цитата JoeUser @ Неужели не понятно, что эти значения были исключительно для демонстрации использования array_values? Честно говоря нет )))) ну что ж, туплю ))) Добавлено Теоретически дальше можно было бы извлекать значения и присваивать их переменным с помощью цикла построенного на array_shift пока count не станет равен нулю. Но как автоматически создавать новые переменные? Тоесть код возможно должен выглядеть как-то так: $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 */ Или есть какая-то стандартная функция для такой задачи? |
Сообщ.
#6
,
|
|
|
"Автоматическая генерация" переменных языком PHP не предусмотрена. И, если честно, я не знаю такого языка, где такое возможно. Ибо это какой-то бред! Для одиночного значения есть обычная скалярная переменная, для множеств - есть массивы. Вся эта, извиняюсь, белиберда с извлечением в цикле, возможна ... но зачем? Если можно сделать одним оператором!
Можно конечно замутить что-то типа: foreach ($mas[0] as $i) { $mas1[] = $i; } Повторюсь, но зачем, если можно проще? |
Сообщ.
#7
,
|
|
|
Цитата JoeUser @ Повторюсь, но зачем, если можно проще? Для создания "динамичного" списка с которым потом будет работать пользователь. В списке значение поля будет равно значению новой переменной, ну или в вашем варианте значению элемента массива. Думалось так будет легче. Можно конечно создавать количество полей в списке по значению count, чтоб не было пустых полей и хватило на все элементы. И надо ж в имени поля выводить индекс элемента, не писать же от руки кучу полей, а потом часть скрывать? Да и боялся запутаться в индексах элементов, мало ли где ещё потом пришлось бы это использовать. А так есть переменная вне массива и делай, тягай её куда хочешь. Хотя возможно вы правы, надо подумать. |
Сообщ.
#8
,
|
|
|
Цитата D-G @ Для создания "динамичного" списка с которым потом будет работать пользователь. При программировании, да и вообще в жизни - рекомендую пользовать сей принцип. Это поможет. |
Сообщ.
#9
,
|
|
|
Цитата JoeUser @ При программировании, да и вообще в жизни - рекомендую пользовать сей принцип. Это поможет. Совершенно согласен. Только для этого нужно видеть несколько способов, а потом уже выбирать самый простой. А я только учусь. Ещё много чего не вижу и не умею, приходится пробовать сперва более сложное, потом упрощать. В принципе я уже почти сделал то, что хотел добиться в этой теме. По крайней мере думал, что добился. Все красиво получалось. Стал я чистить код от лишних проверок и распечаток. Убрал вот эту строку: 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 |
Сообщ.
#10
,
|
|
|
Цитата JoeUser @ Повторюсь, но зачем, если можно проще? Вы знаете, напробовался и вы правы, все гораздо проще. Чуток попозже покажу свои результаты, может подскажите ещё где можно упростить. А пока, наверно, оставлю тему открытой, хотя в целом более менее понятно и получается. |