Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Значение переменной через запятую (https://javascript.ru/forum/server/50851-znachenie-peremennojj-cherez-zapyatuyu.html)

DDSSDD 14.10.2014 15:11

Значение переменной через запятую
 
Подскажите пожалуйста.
Есть поле, в котором значение введено через запятую:
Иванов, Сидоров, Петров и т. д.

Данные передаются методом PОST обработчику PHP:


$name = $_POST[name];


Соответственно переменная $name имеет значение: Иванов, Сидоров, Петров и т. д.

Мне нужно через оператор if вывести данные если соблюдается условие:
1. Получен только Иванов - выводим данные;
2. Получен Иванов и др. - тоже выводим данные;
4. Не получен Иванов - не выводим данные;
5. Не получен Иванов, но получены другие - не выводим данные.

Делал так:

if ($name=="Иванов") {
echo ' <p>Иванов</p> ';}


Это работает, если в поле введено только одно имя Иванов.
Если же ввести несколько значений через запятую: Иванов, Сидоров, Петров.
Ничего не выводит...

Задача, я так понимаю элементарная, но вот гуглю уже несколько часов и никак не могу решить проблему.
В PHP не силен.
Возможно как то через массив это все сделать. Вся проблема в получаемом значении через запятую...

То есть по сути мой вопрос заключается в том: Как выбрать из строки (которая является значением переменной), в которой данные указаны через запятую одно значение и через оператор вывести данные в зависимости от того есть это значение в строке или нет.

voral 14.10.2014 15:22

explode(',',$_POST['name']) вам может помочь

voral 14.10.2014 15:22

только про пробелы не забывайте

ksa 14.10.2014 15:38

Цитата:

Сообщение от DDSSDD
1. Получен только Иванов - выводим данные;
2. Получен Иванов и др. - тоже выводим данные;
4. Не получен Иванов - не выводим данные;
5. Не получен Иванов, но получены другие - не выводим данные.

http://php-include.ru/stati/poisk-podstroki-v-stroke

danik.js 14.10.2014 16:01

ksa, а как тут это поможет? Покажи пример.

voral 14.10.2014 16:10

Цитата:

Сообщение от danik.js
ksa, а как тут это поможет? Покажи пример.

А кстати, если условия здесь указаны полностью и правильно, то поиска подстроки вполне достаточно. Т.к. все 4 можно свести к двум вариантам:
1. Если фамилия иванов присутствует - выводим
2. Не присутствует - не выводим

DDSSDD 14.10.2014 16:10

Спасибо - работает!
Никогда б не догадался сформулировать запрос гуглу "Поиск подстроки в строке" :thanks:

ksa 14.10.2014 16:14

Цитата:

Сообщение от danik.js
а как тут это поможет? Покажи пример

С ПХП не работаю...
Но судя по условиям ТСа, достаточно простого вхождения "Иванов" в полученую строку для вывода информации...

На COS это выглядит так

if %request.Data("name",1)["Иванов" {
	// какой-то там вывод
}

danik.js 14.10.2014 16:38

Цитата:

Сообщение от ksa
достаточно простого вхождения "Иванов" в полученую строку для вывода информации

$name = 'Сидоров, Иванова';
if ($strpos($name, 'Иванов') !== false) {
    // упс..
}

voral 14.10.2014 16:58

точняк. Тогда можно регекспами взять
хотя преобразовать в массив - универсальнее.

danik.js 14.10.2014 17:04

Ну со strpos тоже есть вариант:
$name = 'Сидоров, Иванова';
if (strpos(' ' . $name . ',',  ' ' . 'Иванов' . ',') {

}

DDSSDD 14.10.2014 17:17

danik.js Спасибо! Так компактнее!

Только у тебя ошибка не :
$strpos
а:
strpos:victory:

danik.js 14.10.2014 17:25

На мой взгляд самый понятный и юзабельный вариант:
<?php
$name = 'Сидоров, Иванова';

$names = array_map('trim', explode(',', $name));

if (in_array('Иванов', $names)) {

}

voral 14.10.2014 17:27

danik.js,
этож из _POST. Еще там может быть лишний пробел, точка вместо запятой. Танцы с Капсом....... я за регулярку... :)

DDSSDD 14.10.2014 17:59

В моем случае такого не будет ибо данне приходят из мультиселекта под chosen. Юзер только выбирает их.

danik.js 14.10.2014 18:03

Цитата:

Сообщение от DDSSDD
ибо данне приходят из мультиселекта под chosen

Че тогда за хрень? Разве мультиселект с именем name[] не должен приходить как массив? С нативным <select multiple> именно так и работает.

DDSSDD 14.10.2014 18:14

Цитата:

Сообщение от danik.js (Сообщение 335425)
Че тогда за хрень? Разве мультиселект с именем name[] не должен приходить как массив? С нативным <select multiple> именно так и работает.

http://harvesthq.github.io/chosen/

danik.js 14.10.2014 18:28

Ну судя по всему он через скрытый <select multiple> и работает. Так откуда тогда у тебя запятые берутся? Это походу ты чета намудрил..

DDSSDD 14.10.2014 18:39

Да вродь не мудрил...
Берутся видать от сюда http://cdnjs.cloudflare.com/ajax/lib....jquery.min.js

Ну его наф. там копаться))

danik.js 14.10.2014 18:43

.val() ты не вызываешь у себя в коде?
Как отсылаются данные на сервер?

DDSSDD 14.10.2014 18:49

function send()
{

var i1 = $('#i1').val();
var i0 = $('#i0').val();
var i7 = $('#i7').val();

       $.ajax({
                type: "POST",
                url: "Step.php",
                data: "i1="+i1+"&i0="+i0+"&i7="+i7,
   
                success: function(html) {

                        $("#spi").empty();

                        $("#spi").append(html);
                }
        });
}

danik.js 14.10.2014 18:53

Ну ясно теперь :D
Это делается так: дается общий класс, допустим .i и пишем:
..
data: $('.i').serialize()
..

Имена даем со скобочкой. То есть было names, стало names[]

В php все также, только теперь в $_POST['names'] у нас будет уже готовый массив.


Итог - код сократили, как js так и php а работает все также, даже лучше!

danik.js 14.10.2014 18:55

Цитата:

Сообщение от DDSSDD
 $("#spi").empty();
 
                        $( "#spi").append(html);

Это можно записать как $("#spi").html(html)

DDSSDD 14.10.2014 18:57

Ок. Спасибо!

danik.js 14.10.2014 18:59

Цитата:

Сообщение от DDSSDD
Ок. Спасибо!

Это следует понимать как "Я все понял, но мне и так сойдет", верно? :D

DDSSDD 14.10.2014 19:08

Да я щас уже над другим голову ломаю (эту проблему решил благодаря вам - форумчанинам)... Мне бы нет, что б готовые плагины использовать, так изобретаю велосипед как всегда, да еще и корявый...
Закончу мож. кину потом на растерзание и засвистывание всем))

А за помощь - спасибо! Съэкономил кучу времени:thanks:

DDSSDD 14.10.2014 19:16

Как вот блин замутить, что бы размер imputa менялся динамически, в зависимости от количества этих импутов в родительском блоке.
А вот их количество как раз определяет мультиселект о котором давеча шла речь...
Я с PHP вывожу импут, который соответствует пункту мультиселекта.

То есть задаешь максимальную ширину этого импута и если он один то отображается по центру и с большей шириной, если их несколько то пропорционально размещаются в родительском блоке :blink:

danik.js 14.10.2014 20:11

Ты описал поведение таблицы.

<!DOCTYPE html>
<style>
.row{
display: table;
width: 100%;
table-layout: fixed;
}
.cell{
display: table-cell;
padding: 2px;
}
input{
box-sizing: border-box;
width: 100%;
</style>
<div class="row" id="row">
<div class="cell">
    <input>
</div>
<div class="cell">
    <input>
</div>
</div>
<button onclick="row.appendChild(row.firstElementChild.cloneNode(true))">Добавить</button>

DDSSDD 15.10.2014 13:14

Это не совсем то, что мне нужно.
Вот как это выглядит http://ddssdd.w.pw/test.html

Из выпадающего списка можно выбрать 10 наименований товара.
При выборе любого пункта мультиселекта и переходе к следующему этапу PHP скрипт генерит для каждого из них отдельный инпут в который будет вводится количество по каждому пункту.

При чем юзер может выбрать как один так и все десять пунктов.
Задача в том, что бы отображать эти импуты пропорционально размеру блока родителя. То есть если юзер выбрал один пункт, то на следующем этапе он получает один импут большого размера (отцентрованный в родителе), выбрал десять - получил десять импутов одинаковой ширины и длины симметрично отцентрованных... и т. д.:blink:

danik.js 15.10.2014 13:19

Цитата:

Сообщение от DDSSDD
симметрично

Симметрично чего? Инпуты горизонтально или вертикально должны отображаться? Сделай два html-примера. Для одного инпута и для пяти, скажем.

DDSSDD 15.10.2014 13:20

Ок. Ща.

danik.js 15.10.2014 13:21

Или тебе просто нужно чтобы инпуты себя вели как обычные div'ы, Ну width: 100%, box-sizing: border-box в помщь

DDSSDD 15.10.2014 13:48

Вложений: 3
В прикрепленных файлах.
Там вопрос весь в центровке и обтекании если их много.

danik.js 15.10.2014 14:33

Ну когда в одну колонку - все понятно.
Когда инпутов много, на PHP бъешь их на пары, через array_chunk().
Кроме того, добавляешь особый класс строкам, чтобы назначить особые стили.

DDSSDD 15.10.2014 14:51

Ниче не понял...
Я думаю, что нужно написать скрипт, который будет отслеживать количество импутов и в зависимости от их количества назначать ипутам соответствующие классы (размер, позиционирование и т д.).
Так как программист с меня мягко говоря херовый - вот сижу и мудрю...

Ты это же имел в виду?? Т.е. с помощью массива отслеживать выбранные пункты и назначать выводимым импутам соответствующие классы?

danik.js 15.10.2014 15:17

Чет про array_chunk не в тему наверно. У тебя же не массив, а просто число - count, так же?
Вот пример на js:

<style>
div{
text-align: center;
}
input.wide{
width: 250px;
}

input.narrow{
width: 100px;
}
</style>
<script>
var count = +prompt('Число инпутов', 5);

var cols = 1;
var className = 'wide';

if (count > 5) {
	className = 'narrow';
	cols = 2;
}
var rows = Math.ceil(count/cols);
for (var i = 0; i < rows; i++) {
	document.write('<div>');
	for (var j = 0; j < cols && (i + 1) * (j + 1) <= count; j++) {
		document.write('<input class="' + className + '" />');
	}
	document.write('</div>');
}
</script>

DDSSDD 16.10.2014 12:59

Да, все классно! Но у меня каждый импут с уникальным id, по которым далее будет работать программа. У тебя JS генерит импуты, а мне нужно, что бы это делал PHP. Вот как в PHP посчитать ипуты без массива, чето не могу понять...

danik.js 16.10.2014 13:17

Цитата:

Сообщение от DDSSDD
У тебя JS генерит импуты, а мне нужно, что бы это делал PHP

Ты, че не осилишь замену document.write на echo?

DDSSDD 16.10.2014 13:51

И имеешь в виду вставит JS в PHP а в сам JS вместо document.write - echo?

danik.js 16.10.2014 14:05

Имею ввиду переписать код на php. убрать var, добавить баксы, заменить Math.ceil


Часовой пояс GMT +3, время: 11:08.