powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите с функцией замены
21 сообщений из 21, страница 1 из 1
Помогите с функцией замены
    #38024538
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеем текст вытянутый из БД примерно такого вида

Код: html
1.
2.
3.
4.
5.
Обручальное кольцо украшено 
2 агатами круглой огранки диаметром 1 мм., 
4 сапфирами круглой огранки диаметром 1,5 мм. и 
9 агатами круглой огранки диаметром 1,7 мм. 
calculator:d1=2,d1_5=4,d1_7=9



как мне из этого текста средствами php можно вытянуть нужные мне числа.
Поясняю: все, что написано после слова "calculator:" мне необходимо превратить в переменные для моего скрипта т.е.
в скрипте заложены константы "$d1=500; $d1_5=1500; $d1_7=1700;" мне нужно превратить мою текстовую строку "d1=2,d1_5=4,d1_7=9" в конечное число 22300 (2*500+4*1500+9*1700 = 22300)


я пытался придумать код вот такого вида, но получается что-то отвратительное

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?
$d1=500;
$d1_5=1500;
$d1_7=1700;

$str3  = "d1=2,d1_5=4,d1_7=9";
$str2 = array("$d1*","$d1_5*","$d1_7*","+");
$str1 = array("d1=","d1_5=","d1_7=",",");

$last_str = str_replace($str1, $str2, $str3);

echo $last_str;

?>




ГУРУ! Помогите ради Христа! Очень надо!
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024576
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже мозг вскипел, а очень надо! Неужели никто не знает как мне можно помочь? )
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024579
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема то в чем?
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024677
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Как обычно хотят готовое решение, что на автора написали и протестировали.

Pelsh,

Регулярные выражения Вам в помощь. Или заменами до прямого выполняемого кода практически то что сами и написали.
А вообще на лицо не правильная организация данных. Лучше бы calculator:d1=2,d1_5=4,d1_7=9 и вынести в отдельные поля и хранить массивом, тогда можно было-бы и описание из не го генерить а не хранить.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024695
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024722
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergSW,

Посоветуйте как лучше организовать хранение данных? Пока админка еще не дописана - придумаю как изменить?
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024733
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pelsh,

В простейшем случае поле в БД отдельное заводите. В поле можно пихать серилизованный массив, который изначально имеет вид array('диаметр'=>'количество'). Для Вашего примера массив выглядел бы так:
Код: php
1.
2.
3.
4.
5.
array(
	'd1' => 2,
	'd1_5' => 4,
	'd1_7' => 9
)



Цены в виде отдельных переменных тоже хранить нет смысла, удобнее пихнуть в массив с аналогичными ключами. Однако, это тот же уровень.


Можно пойти дальше, сделать гораздо более гибкое решение. Таблицы: "товары", "компоненты в товарах" (содержит id товара, id компонента и кол-во единиц данного компонента), "компоненты и их цены". При таком раскладе вычисление суммарной цены можно целиком (или почти целиком) сбагрить в SQL-запрос.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024736
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...Да и описание в части состава изделия тоже генерить можно, а не вбивать ручками :-)
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024737
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pelsh,

Если с этими данными типа "d1=2,d1_5=4,d1_7=9" не планируете работать на уровне sql, то можно просто массивом чтоб не плодить сущностей (работать через сериализацию, в случае с ORM она это на себя возьмёт). Тогда в php работаете просто как с массивом, например.
Код: php
1.
2.
3.
4.
5.
6.
7.
$data = array(
	array(
		'stone' => 'рубина',
		'd' => 1.7,
		'count' => 2,
	)
);


из данных такой структуры и текстовую строку легко собрать
Код: php
1.
sprintf("%d %s круглой огранки диаметром %f мм.", $data[$i]['count'], $data[$i]['stone'], $data[$i]['d']);


если важна форма огранки и .т.д. то это тоже можно в $data засунуть и оттуда брать.

При этом варианте не надо хранить описание.

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

Тут уж с чем легче работать.

Но хранить в тексте и потом его парсить, это ИМХО скажем так не правильно.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024848
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста еще немного. Сейчас штудировал литературу в разделе «работа с массивами» однако т.к. ранее с ними не работал прошу немного помочь.

Имеем код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//цены на камни без привязки к типу 
$ d1=500; $d1_5=1500; $d1_7=1700;

//далее вынимаем из бд массив
array(
	'd1' => 2,
	'd1_5' => 4,
	'd1_7' => 9
)

//и как мне теперь узнать общую цену камней зная их диаметр, количество и цену???
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024854
Фотография ILL HEAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pelsh,

делайте цены ассоциативным массивом и циклом по нему
примерно так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
//цены на камни без привязки к типу
$price = array (
	'd1' => 500,
	'd1_5' => 1500,
	'd1_7' => 1700
);

//далее вынимаем из бд массив
$quantity = array (
	'd1' => 2,
	'd1_5' => 4,
	'd1_7' => 9
);

//и как мне теперь узнать общую цену камней зная их диаметр, количество и цену???
foreach ( $price as $k => $v ) {
	$total += $v * $quantity[$k];
}

echo $total;
?>
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024879
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pelsh,

Как-то сомневаюсь, что цена камней только от диаметра зависит
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
$values = array(
	'рубин' => array(
		1 => 300,
		1.3 => 500,
		1.7 => 700,
	),
	'сапфир' => array(
		1 => 500,
		1.3 => 700,
		1.7 => 900,
	),
	'брилиант' => array(
		1 => 600,
		1.3 => 1500,
		1.7 => 1700,
	),
);

$data = array(
	array(
		'stone' => 'рубин',
		'd' => 1,
		'count' => 2,
	),
	array(
		'stone' => 'сапфир',
		'd' => 1.2,
		'count' => 2,
	),
	array(
		'stone' => 'брилиант',
		'd' => 1.7,
		'count' => 3,
	),
);

foreach($data as $stone){
	$price += $values[$stone['stone']][$stone['d']] * $stone['count'];
}
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024916
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSWКак-то сомневаюсь, что цена камней только от диаметра зависит+1.
Сомневаюсь, что и такое решение с делением по названию камушка будет нормально работать в реальности. Потом окажется, что цена зависит от типа огранки и количества граней, от цвета, от "уникальности", производителя, места добычи, конкретной поставки или еще чего... И в итоге массив разрастется до неприличных размеров и будет иметь огромное количество элементов, бОльшей частью совершенно ненужных для вычисления стоимости конкретного изделия. Потому, как писал выше, данные о камнях считаю правильным поместить в таблицу-справочник. Но при таком раскладе делать вычисления, используя промежуточный массив и цикл... несколько теряет смысл.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024920
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,


vkleСомневаюсь, что и такое решение с делением по названию камушка будет нормально работать в реальности.

оно и понятно, это для примера привел. По хорошему надо прайс с параметрами камушков в базу вносить.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38024925
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Для себя использую простой критерий, если отбор идёт по 1-2 параметрам - массивы, если больше - таблицы. В отдельных случаях может быть массив по составному ключу.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38025303
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эта конструкция не работает. всегда выдает сумму 8300 не зависимо от того, какие диаметры указать

SergSWPelsh,

Как-то сомневаюсь, что цена камней только от диаметра зависит
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
$values = array(
	'рубин' => array(
		1 => 300,
		1.3 => 500,
		1.7 => 700,
	),
	'сапфир' => array(
		1 => 500,
		1.3 => 700,
		1.7 => 900,
	),
	'брилиант' => array(
		1 => 600,
		1.3 => 1500,
		1.7 => 1700,
	),
);

$data = array(
	array(
		'stone' => 'рубин',
		'd' => 1,
		'count' => 2,
	),
	array(
		'stone' => 'сапфир',
		'd' => 1.2,
		'count' => 2,
	),
	array(
		'stone' => 'брилиант',
		'd' => 1.7,
		'count' => 3,
	),
);

foreach($data as $stone){
	$price += $values[$stone['stone']][$stone['d']] * $stone['count'];
}
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38025306
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleSergSWКак-то сомневаюсь, что цена камней только от диаметра зависит+1.
Сомневаюсь, что и такое решение с делением по названию камушка будет нормально работать в реальности. Потом окажется, что цена зависит от типа огранки и количества граней, от цвета, от "уникальности", производителя, места добычи, конкретной поставки или еще чего... И в итоге массив разрастется до неприличных размеров и будет иметь огромное количество элементов, бОльшей частью совершенно ненужных для вычисления стоимости конкретного изделия. Потому, как писал выше, данные о камнях считаю правильным поместить в таблицу-справочник. Но при таком раскладе делать вычисления, используя промежуточный массив и цикл... несколько теряет смысл.

Да действительно цена зависит от насыщенности цвета, места добычи, конкретной поставки, курса доллара, НО все это становится мелочью когда понимаешь какая наценка на товар ))) по этому все цены приближенные и зависят по большей части именно от диаметра камня.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38025309
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pelsh,

Код написан на коленке и призван показать идею. А не дать готовое решение.
К тому же не понятно какие диаметры и куда меняете. Да и так очевидно что для d=1.2 цена не будет найдена т.к. её нет в $values. Сама по себе конструкция рабочая.
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38025311
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ILL HEAD,

Ваша конструкция отлично считает!! Спасибо!!
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?
//цены на камни без привязки к типу
$price = array (
	'd1' => 500,
	'd1_5' => 1500,
	'd1_7' => 1700
);

//далее вынимаем из бд массив
$quantity = array (
	'd1' => 1,
	'd1_5' => 1,
	'd1_7' => 3
);

//и как мне теперь узнать общую цену камней зная их диаметр, количество и цену???
foreach ( $price as $k => $v ) {
	$total += $v * $quantity[$k];
}

echo $total;
?>
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38025312
Pelsh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergSWPelsh,

Код написан на коленке и призван показать идею. А не дать готовое решение.
К тому же не понятно какие диаметры и куда меняете. Да и так очевидно что для d=1.2 цена не будет найдена т.к. её нет в $values. Сама по себе конструкция рабочая.

ошибку с d=1.2 я увидел сразу и исправил, однако все равно конструкция не рабочая получилась по какой-то причине!
...
Рейтинг: 0 / 0
Помогите с функцией замены
    #38025313
SergSW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSW,

был не прав была принц ошибка, правильней так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
$values = array(
	'рубин' => array(
		'1' => 300,
		'1.3' => 500,
		'1.7' => 700,
	),
	'сапфир' => array(
		'1' => 500,
		'1.3' => 700,
		'1.7' => 900,
	),
	'брилиант' => array(
		'1' => 600,
		'1.3' => 1500,
		'1.7' => 1700,
	),
);

$data = array(
	array(
		'stone' => 'рубин',
		'd' => '1',
		'count' => 2,
	),
	array(
		'stone' => 'сапфир',
		'd' => '1.2',
		'count' => 2,
	),
	array(
		'stone' => 'брилиант',
		'd' => '1.7',
		'count' => 3,
	),
);

foreach($data as $stone){
	$price += $values[$stone['stone']][$stone['d']] * $stone['count'];



Что поделать PHP "очень хорош" не может нормально с float ключами работать. Забыл об этом.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите с функцией замены
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]