Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Разделение строки


Автор: s1lver 30.4.2014, 14:13
Доброго времени суток!

Подскажите в чем может быть проблема при разделении строки?

Имеется код который возвращает список вида - *111*111*текст*текст

С помощью explode пытаюсь разделить ее на составлющие по *. Однако вместо разделения происходит удаление * smile . Подскажите в чем может быть проблема?

Код

          <ul> <?$items = GetIBlockElementList(5, false, Array("name"=>"asc"), 100);
while($arItem = $items->GetNext())
                            {?> <?$id_elem = $arItem["ID"];?> <?
$db_props = CIBlockElement::GetProperty($id, $id_elem, "sort", "asc", array());
$PROPS = array();?> 
            <li> <? 
while($ar_props = $db_props->Fetch()){
$id_element = $ar_props['VALUE'];
$id_element_str ="*".$id_element;

    echo $id_element_str;
$ex_id_element = explode("*",$id_element_str);
    //echo $ex_id_element[0];
}?> </li>
           <?}?> </ul>

Автор: Aliance 30.4.2014, 14:54
explode ничего не удаляет, просто зачем было делать конкатенацию с разделителем в начале строки, а потом смотреть в первый элемент массива, естественно, что он будет пустым.

Автор: s1lver 30.4.2014, 15:33
я имею ввиду, если вывести так

Код

echo $ex_id_element[1];

, то строка примет вид 111111тексттекст.

Т.е выводится строка вся полностью, но без звездочек. А хочется то, чтобы по $ex_id_element[0] - первый элемент, а по $ex_id_element[1] - второй элемент.

Автор: Aliance 30.4.2014, 15:42
Видимо, такой результат получается из-за того, что такова изначальная строка (без звездочек), вот она вся и попадает во второй элемент в массиве (первый становится пустым, т.к. вы делаете конкатенацию).

Что выводят дампы???
Код

$id_element = $ar_props['VALUE'];

var_dump($id_element);

$id_element_str ="*".$id_element;
    echo $id_element_str;
$ex_id_element = explode("*",$id_element_str);

var_dump($ex_id_element);

Автор: s1lver 30.4.2014, 15:51
Первый:

string(3) "111" string(3) "111" string(5) "текст" string(5) "текст"

Второй:

array(2) { [0]=> string(3) "111" [1]=> string(0) "" } array(2) { [0]=> string(3) "111" [1]=> string(0) "" } array(2) { [0]=> string(5) "текст" [1]=> string(0) "" } array(2) { [0]=> string(5) "текст" [1]=> string(0) "" }

Автор: Aliance 30.4.2014, 15:54
Ну и какие из этого выводы? У цикла while в данном случае 4 итерации, в каждой из них текстовая переменная не имеет никаких символов-разделителей. Подозреваю, что вам нужно следующее:

Код

          <ul> <?$items = GetIBlockElementList(5, false, Array("name"=>"asc"), 100);
while($arItem = $items->GetNext())
                            {?> <?$id_elem = $arItem["ID"];?> <?
$db_props = CIBlockElement::GetProperty($id, $id_elem, "sort", "asc", array());
$PROPS = array();?> 
            <li> <? 
while($ar_props = $db_props->Fetch()){
$id_element = $ar_props['VALUE'];
$elementsArray[] . = $id_element;
}?> </li>
           <? var_dump($elementsArray); }?> </ul>

Автор: s1lver 30.4.2014, 16:04
Вот, это уже намного лучше smile 

array(4) { [0]=> string(3) "111" [1]=> string(3) "111" [2]=> string(5) "текст" [3]=> string(5) "текст" }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)