Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Преобразование строки в массив
 
 автор: azEsm   (17.01.2014 в 10:12)   письмо автору
 
 

Добрый день.
Подскажите, можно ли как-нибудь в php из строки вида

"a=b
c=d
e=f"

получить массив

"a"="b"
"c"="d"
"e"="f"

Пока додумался только до двух массивов - один с ключами, другой со значениями...

  Ответить  
 
 автор: Valick   (17.01.2014 в 10:16)   письмо автору
 
   для: azEsm   (17.01.2014 в 10:12)
 

в РНР есть функция explode()
она может помочь, при условии, что формат строки не меняется
лучше конечно когда строка не содержит "переходов строки", просто эти спец знаки различны для разных операционных систем
__
расскажите откуда берётся строка и почему она именно в таком виде?

  Ответить  
 
 автор: azEsm   (17.01.2014 в 10:42)   письмо автору
 
   для: Valick   (17.01.2014 в 10:16)
 

explode("=", "a=b") выдаёт "[1]=>a [2]=>b", а мне желательно, чтобы было "a"="b"

  Ответить  
 
 автор: Valick   (17.01.2014 в 10:52)   письмо автору
 
   для: azEsm   (17.01.2014 в 10:42)
 

:)
$e = explode("=", "a=b");
$arr[$e[1]]=$e[2];

___
ответьте на мой вопрос, возможно имеется более правильное решение

  Ответить  
 
 автор: azEsm   (17.01.2014 в 11:14)   письмо автору
 
   для: Valick   (17.01.2014 в 10:52)
 

Спасибо! Это как раз то, что нужно. Затупорылил :)

Только там $arr[$e[0]=$e[1];

  Ответить  
 
 автор: azEsm   (17.01.2014 в 12:01)   письмо автору
 
   для: Valick   (17.01.2014 в 10:52)
 

А не в курсе, случаем, почему такая проверка не работает

$a = explode("=", $array[$i]);
if(!empty($a[0]))
{
$data[$a[0]]=$a[1];
}

а работает только if(!empty($a[1]))? Даже если строка пустая, всё равно в первом случае в массив пишется "[]=>"

  Ответить  
 
 автор: Valick   (17.01.2014 в 12:35)   письмо автору
 
   для: azEsm   (17.01.2014 в 12:01)
 

если там ноль или пусто, то это empty
___
вы упорно не хотите отвечать на мой вопрос, а зря

  Ответить  
 
 автор: azEsm   (17.01.2014 в 12:43)   письмо автору
 
   для: Valick   (17.01.2014 в 12:35)
 

Это понятно, просто когда проверяю по a[0] , то даже если она пустая ($array[$i] вообще пустая строка), выражение всё равно выполняется, а если проверяю по a[1], то не выполняется, работает, как задумано.
Но мне крайне желательно проверять именно по a[0].

  Ответить  
 
 автор: confirm   (17.01.2014 в 12:46)   письмо автору
 
   для: azEsm   (17.01.2014 в 12:43)
 

Проверять что и после чего?

  Ответить  
 
 автор: Valick   (17.01.2014 в 12:48)   письмо автору
 
   для: azEsm   (17.01.2014 в 12:43)
 

а мне уже жутко желательно чтобы вы ответили на мой вопрос в моем первом посте:
"откуда берется эта строка и почему она именно в таком виде"
Я же должен хотя бы смутно представлять что вы там вообще творите.
От этого зависит качество и оперативность оптимально правильного ответа.

  Ответить  
 
 автор: azEsm   (17.01.2014 в 13:07)   письмо автору
 
   для: Valick   (17.01.2014 в 12:48)
 

Вообще, она берётся из файла, в котором записаны параметры в виде
a=b
d=j
d=y
и т.п. Это я всё уже сделал, осталось проверку на пустые строки делать. Вот вся функция целиком:


function readprop($filename) 
{
    $handler = fopen($filename, "r");
    while(!feof($handler)) 
    {
        $array[]=fgets($handler);
    }
    
    for($i=0; $i<count($array); $i++)
    {
        $a = explode("=", $array[$i]);
        if(!empty($a[1]) && $a[0]{0}!="#") 
        {
            $data[$a[0]]=$a[1];
        }
    }
    
    return $data;
}


if(!empty($a[1]) && $a[0]{0}!="#") проверяет, не закомментирована ли строка и заполнена ли она. Но проверяет по второму элементу, а желательно проверять первый элемент. Если сделать if(!empty($a[0])), то даже если строка пустая, она всё равно пишется в $data в виде "[]=>".

  Ответить  
 
 автор: confirm   (17.01.2014 в 13:15)   письмо автору
 
   для: azEsm   (17.01.2014 в 13:07)
 

Начните с file(), это сразу вернет массив, а fopen тут не нужна.
Explode в любом случае вернет массив, и если ожидается, что по разбиению должно быть два элемента в нем, то нужно проверять количество элементов, а не "пустоту". ПО условию проверки принимать действия. Если необходимо удаление пустых элементов, то их надо просто удалять, без всяких if(!empty($a[1]) и прочего.

  Ответить  
 
 автор: Valick   (17.01.2014 в 14:32)   письмо автору
 
   для: azEsm   (17.01.2014 в 13:07)
 

1) Вы читаете файл целиком в массив, в этом нет смысла применять fgets
проще как сказал confirm использовать file()
2) я так понимаю файл не ваш, и у вас нет возможности структурировать его более детально без всяких пустых строк и тд.
Покажите кусок файла с реальными данными
По хорошему конечно читать файл посимвольно

  Ответить  
 
 автор: Sfinks   (17.01.2014 в 22:59)   письмо автору
 
   для: Valick   (17.01.2014 в 14:32)
 

> в этом нет смысла
если конечно файл не 100 гигов....

А, не, пардон.
Не досмотрел, что вся обработка происходит уже после чтения.
Так конечно да.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования