PDA

Просмотр полной версии : Вопрос по функции php


lovepsone
11.05.2011, 20:41
как правильно пишется функция типа :
для каждого (целого числа А) установить b(целая А) = с(целая А)
Где b,с -переменные
Целая А = числа от 1 до 20

Кот ДаWINчи
11.05.2011, 21:36
Где b,с -переменные

$b,$c всё же переменные или массивы?

Например, массив $с задаём так :

$c = array(
1 => '...',
2 => '...',
3 => '...',
4 => '...',
5 => '...',
6 => '...',
7 => '...',
8 => '...',
9 => '...',
10 => '...',
11 => '...',
12 => '...',
13 => '...',
14 => '...',
15 => '...',
16 => '...',
17 => '...',
18 => '...',
19 => '...',
20 => '...');

Массив $b тогда получает значения :

$b[$a] = $c[$a];

если нужно пройти по всему массиву - используй цикл.


ps. (а что, умные книжки про пхп читать "не царское это дело"?)


ах да.... среди ночи я сразу и не допер...
По условию дано:
для каждого (целого числа А) установить b(целая А) = с(целая А)

тогда $b = $c ... и этого будет достаточно. Умный пхп перенесет все значения из массива $с в массив $b ;)

если же в $с значений больше чем 1-20, то тогда - цикл.

lovepsone
11.05.2011, 21:58
а вот что вышло у меня:

$value= (1,2,3,4,5,6,7...20);
foreach ($integer as $value) {$b[$value]=$c[$value]}
я не так уж давно ізучаю пхп и хочу разобраться с функциями
если есть проще вариант то предложите либо исправте меня!
мне нужно чтобы переменная $value проходила по числам от 1 до 20 (новерное так)
то есть вот так
для каждого (целого числа А(от 1 до 20)) установить b(целая А) = с(целая А)


тогда $b = $c ... и этого будет достаточно. Умный пхп перенесет все значения из массива $с в массив $b ;)

если же в $с значений больше чем 1-20, то тогда - цикл.
а если по вашему делать то проще будет наверное так?

$value= (1,2,3,4,5,6,7...20);
foreach ($integer as $value) {$b=$c}

в общем у меня все получилось! спасибо
функция у меня сама выглядит вот так:
$a = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,);
foreach ($a as $val)
{
selectDb('lk');
$sql_text = mysql_query ("SELECT text_loc8 FROM text WHERE id=$val");
$write[$val] = mysql_result ($sql_text,0);
}


Было бы круто если вот эту строку заменить $a = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,);
на типа
$a = array(числа от 1 до 20);

Спасибо Кот ДаWINчи за направленный путь!

Nordway
13.05.2011, 07:27
Было бы круто если вот эту строку заменить $a = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,);
на типа
$a = array(числа от 1 до 20);


Может быть так:
1.

$a = 0;
while ($a < 20)
{
$a++;
/* работаем с переменной $a */
}


2.

for ($a = 0; $a++ < 20;)
{
/* работаем с переменной $a */
}

lovepsone
13.05.2011, 13:30
Хм..... Спасибо!
Я как раз начал читать про цикл while
получилось вот так:
for ($a = 0; $a++ < 100;)
{
selectDb('lk');
$sql_text = mysql_query ("SELECT text_loc8 FROM text WHERE id=$a");
$write[$a] = mysql_result ($sql_text,0);
}

В дальнейшем тему не закрывайте пожалуйсто. Может еще чего спрошу.

Minimajack
13.05.2011, 13:33
$a = array_keys(array_fill(1,20,0));

lovepsone
13.05.2011, 18:44
$a = array_keys(array_fill(1,20,0));

как то я до этого не додумался! Мне кажется что тут выбор уже по вкусу. Каждый по своему делает.

Кот ДаWINчи
13.05.2011, 19:22
Хм..... Спасибо!
Я как раз начал читать про цикл while
получилось вот так:
for ($a = 0; $a++ < 100;)
{
selectDb('lk');
$sql_text = mysql_query ("SELECT text_loc8 FROM text WHERE id=$a");
$write[$a] = mysql_result ($sql_text,0);
}

В дальнейшем тему не закрывайте пожалуйсто. Может еще чего спрошу.

сколько, сколько там будет запросов к базе? :swoon2::fool:

не проще ли подготовить один критерий отбора и выполнить ОДИН запрос?


$stroka = "(";
for ($a = 0; $a++ < 100;)
{
$stroka = $stroka.$a;
if ($a < 99) $stroka = $stroka.",";
else $stroka = $stroka.")";
}
selectDb('lk');
$sql_text = mysql_query ("SELECT `text_loc8` FROM `text` WHERE `id` IN $stroka");

и далее разбираем получившийся массив


Не стоит так напрягать MYSQL ...

а можно еще хитрее сделать запрос к базе:


$sql_text = mysql_query ("SELECT `text_loc8` FROM `text` WHERE `id` BETWEEN 0 AND 100");

Minimajack
13.05.2011, 22:43
сколько, сколько там будет запросов к базе? :swoon2::fool:
не проще ли подготовить один критерий отбора и выполнить ОДИН запрос?
$stroka = "(";
for ($a = 0; $a++ < 100;)
{
$stroka = $stroka.$a;
if ($a < 99) $stroka = $stroka.",";
else $stroka = $stroka.")";
}
selectDb('lk');
$sql_text = mysql_query ("SELECT `text_loc8` FROM `text` WHERE `id` IN $stroka");

и далее разбираем получившийся массив


Не стоит так напрягать MYSQL ...

а можно еще хитрее сделать запрос к базе:


$sql_text = mysql_query ("SELECT `text_loc8` FROM `text` WHERE `id` BETWEEN 0 AND 100");

первый вариант лучше так:

$stroka = "(";
for ($a = 0; $a++ < 100;){
$stroka .= $a.',';
}
$stroka = rtrim($stroka, ',').')';
selectDb('lk');
$sql_text = mysql_query ("SELECT `text_loc8` FROM `text` WHERE `id` IN $stroka");

Кот ДаWINчи
14.05.2011, 08:02
Minimajack, оптимизировать код можно долго... если rtrim сработает быстрее чем все if-ы, то ты прав.

lovepsone, как видно из кода, это разработка мультиязычного интерфейса для сайта (ЛК). Не проще ли сразу забить все данные в один массив и пользоваться, а не напрягать базу этим?

lovepsone
14.05.2011, 14:28
Может и проще! Я не знаю как будет проще. Мне больше нравится работать с базой. Хотя я понимаю что идет нагрузка на базу. Я еще подумаю над этим.Мне кажется что проще и то и другое.

Добавлено через 4 минуты
сколько, сколько там будет запросов к базе? :swoon2::fool:

не проще ли подготовить один критерий отбора и выполнить ОДИН запрос?


$stroka = "(";
for ($a = 0; $a++ < 100;)
{
$stroka = $stroka.$a;
if ($a < 99) $stroka = $stroka.",";
else $stroka = $stroka.")";
}
selectDb('lk');
$sql_text = mysql_query ("SELECT `text_loc8` FROM `text` WHERE `id` IN $stroka");

и далее разбираем получившийся массив


Не стоит так напрягать MYSQL ...

а можно еще хитрее сделать запрос к базе:


$sql_text = mysql_query ("SELECT `text_loc8` FROM `text` WHERE `id` BETWEEN 0 AND 100");


Хм.... мне это более нравиться решение. Я использую его. спасибо.

KiriX
15.05.2011, 13:20
Всё бред =) Зачем вообще условия, циклы и тримы, если нам всегда нужны данные с номером до 100? =)
SELECT `text_loc8` FROM `text` WHERE `id` < 100;
Если нужен диапазон - "больше-меньше" все знают как задать и тогда очень хорош вариант с битвином.

lovepsone
15.05.2011, 15:09
а если мне допустим нужно выкинуть какое-то число к примеру 1! как тогда сдесь поступить ??

Lordronn
15.05.2011, 15:15
SELECT `text_loc8` FROM `text` WHERE `id` < 100 AND `id` != 1;

lovepsone
15.05.2011, 15:18
Мда.... мне еще учиться и учиться.

alien
15.05.2011, 18:36
Ну или если несколько выкинуть.
SELECT `text_loc8` FROM `text` WHERE `id` < 100 AND `id` NOT IN(1,5,6) ;

lovepsone
20.05.2011, 23:42
возможно реализовать такую фишку:
if (условия)
{
ждать три секунды
}

Minimajack
20.05.2011, 23:53
http://php.net/manual/en/function.sleep.php

lovepsone
29.06.2011, 15:06
Люди помогите в какую сторону копать.
Хочу написать скрипт который будет выполнять sql запрос каждый день

virusav
29.06.2011, 15:32
На винде в сторону планировщика задач, иначе в сторону cron.

Кот ДаWINчи
29.06.2011, 16:28
на хостинге - cron

на виндовом сервере - планировщик заданий

------------------------
под виндой можно еще свою утилитку написать на дельфи, которая будет работать как планировщик заданий.

Minimajack
29.06.2011, 21:31
windows http://www.nncron.ru/index_ru.shtml
linux cron

HuntsMan
11.08.2011, 00:09
Есть такая проблема. Имеется енум с некоторыми значениями. Имеется абстрактный класс и туча наследуемых от него. Имена наследуемых классов совпадают с именами из енума. Можно ли как-то создавать объект нужного класса, используя значение числа из нкоторой переменной. Насколько я помню в шарпе это позволяла какая-то функция активатора, а есть ли аналог для php?

Minimajack
11.08.2011, 00:25
давайте начнем с того, что в пхп нет енумов...
если вы имеете в виду массив имен переменных(классов) - то как то так:
$myclass = $myenum [$var];
$mynewclass = $myclass();

HuntsMan
11.08.2011, 00:51
Ладно, тогда дефайнов. Я хочу что-то в духе:

defined(CLASS_1, 0);
class CLASS_1 { ...};
$object = GetClass(CLASS_1);

При это геткласс не возвращает объект из массива, а создает новый соотв класса.

пардон за синтаксис, пишу с телефона.

Minimajack
11.08.2011, 00:59
только если
define(CLASS_1, "CLASS_1");
function GetClass($name){
return $name()
}
дополню, предыдущий вариант и не возвращал класс из массива...он возвращал имя класса
зы имхо если вы этого хотите у вас явно проблемы с архитектурой приложения

lovepsone
03.12.2011, 12:05
Привет всем! Далее я обучаюсь в пхп и пишу свой движок и наткнулся на одну проблему, суть ее ниже постараюсь объяснить:
пример:
В базе в mysql у меня содержится ссылка modul=settings .
Когда я перехожу на сайте по ссылке /index.php?modul=settings
у меня должен загрузиться пхп-файл с помощью команды require_once
То есть у меня должна быть проверка с помощью $GET.
Но в базе mysql может содержаться не одна ссылка а несколько ссылок в одно поле к примеру вот так modul=settings/r/nmodul=forum/r/n
То есть функция должна отловить ссылку и проверить есть ли такая ссылка в базе mysql. Если есть то возвращаем значение иначе не возвращаем.
Жду хоть какой то помощи.
(Сверху был пример, а у меня в движке дело обстоит так: У меня содержатся панели (по середине, справа, и слева) и все они вызываются в одном файле index.php и показываются на всех страницах сайта, а мне нужно что бы они показывались не на всех,а показывались на тех которые не находятся в базе)
Есть идеи как такое реализовать ???

Кот ДаWINчи
03.12.2011, 16:09
третий код говорит о том, что ссылки свалены в одно поле!? :swoon:

lovepsone
03.12.2011, 16:13
третий код говорит о том, что ссылки свалены в одно поле!? :swoon:

да так и есть!
Я когда только начинал разбираться в пхп, то такую фишку видел на каком то движке но не помню!

Кот ДаWINчи
03.12.2011, 16:44
это ни есть айс. Это бред ужасный.... Это как при помощи пулемета с полным боезапасом убивать врагов, тупо махая им, как дубиной.

lovepsone
03.12.2011, 16:53
ну а как бы вы посоветовали ???
хотя почему не айс???? если с базы доставать и заносить в массив с помощью explode()! разбивая ссылки и удаляя символы /r/n! Вроде как гуд! но я не могу придумать как отловить ссылку, если бы было к примеру обычная ссылка! index.php/nodule/и т.д то было бы проще! А у меня как в вашем ACP сделано, то есть есть модульность! Просто мне пока не хватает знаний, а может я велосипед изобретаю!

Кот ДаWINчи
03.12.2011, 20:25
под каждую ссылку свою запись - вот решение проблемы.

Но без структуры таблиц о чем то серьезном говорить "не с руки".

lovepsone
03.12.2011, 20:32
CREATE TABLE `wcf_settings` (
`settings_name` varchar(200) collate utf8_unicode_ci NOT NULL default '',
`settings_value` text collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`settings_name`)

Кот ДаWINчи
03.12.2011, 20:43
ключевое поле длиной 200 символов? Ужас...

YuruY
03.12.2011, 22:44
Зато влезет вся хрень. =)))

Nordway
03.12.2011, 22:58
Ну про explode() ты прав, а дальше остаётся разбивать и разбивать :)

$stroki = explode("/r/n", "modul=settings/r/nmodul=forum/r/n");
foreach ($stroki as $stroka)
{
if (empty($stroka)) break;

$arr = explode("=", $stroka);
if ($arr[1] == 'settings') {
// тут что-то с настройками
} elseif ($arr[1] == 'forum') {
// тут что-то с форумом
}
}

Если modul много будет, можно через switch ... case сделать

Кот ДаWINчи
04.12.2011, 09:00
тогда для размышления выдам такую ситуацию:

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

еще одна ситуация:

У модуля в параметрах ссылки хранится значение содержащее "/r/n" ...

Так что, для нормальной работы лучше избегать такие многоссылочные поля.

tempura
04.12.2011, 09:09
Извините за слайтли оффтопик, но словами сантехника пришедшего в обком: "тут всю систему менять надо". :(
1. Невозможно писать систему безграмотно. Не существует слова "modul". Чуток поднатаскаешься в "инглишском изыке", глаз резать начнет, опечатываться сам же будешь. А пакетная замена уже может и не прокатить, так как вполне возможно, что появятся всякие "modul_n" или там "n_modul".
2. Ссылки вида "mysite.ru/index.php?modul=settings" - полный отстой. Крайне рекомендуется в движок сразу закладывать обработку ссылок в формат "mysite.ru/settings/" - причем без использования реврайта, все в РНР делать.
3. Выше уже упоминали, что если с базы доставать и заносить в массив с помощью explode()! разбивая ссылки и удаляя символы /r/n! Вроде как гуд! это совсем не гуд, а вовсе даже и бед. И бред. На какого хрена делать (помянем старый мангос) аналог поля "data"? Зафига в одно поле вводить пицод ссылок, при чтении разбивать их там куда-то зачем-то, рисковать из-за одного неверного знака все грохнуть напрочь, и в итоге даже и самому перестать разбираться в формате записи в этом поле - просто позабыв через пару месяцев принцип его формирования? одна строка - одно значение, и не хрена городить. Надо массив сделать - всю таблицу сгрызть.

Короче, либо я чего-то не понимаю, либо я вообще ничего не понимаю.

Minimajack
07.12.2011, 22:09
Крайне рекомендуется в движок сразу закладывать обработку ссылок в формат "mysite.ru/settings/" - причем без использования реврайта, все в РНР делать.

Уточнение, могут неправильно понять :
Все равно без реврайта не обойтись :pardon: (редиректить на главный скрипт все равно необходимо - 3 строки htaccess), а все остальное обязательно уже пхп ( так называемый роутинг - и очень желательно хранить "это" не в базе)
Со всем остальным согласен полностью