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

Форум PHP

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

 

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

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

тема: Разбивка строки с переменными в массив
 
 автор: Timofeich   (25.01.2008 в 00:07)   письмо автору
 
 

Прошу помощи в реализации задачки:
имеется строка, содержащая описание переменных через запятую, т.е. в виде "переменная1=значение1, переменная2=значение2". Необходимо из этого получить массив, который будет иметь ключи равные названиям переменных и соответствующие значения по значениям переменных, т.е. вид "переменная1 => значение1" и т.д. Возможен случай, когда имя переменной не будет указано в строке, а стоит только значение ("переменная1=значение1, переменная2=значение2, значение3"), тогда такое значение записывается в массив под очередной цифровой нумерацией 0, 1, 2... ("переменная1 => значение1, переменная2 => значение2, 0 => значение3").
Пробелы в значениях переменных игнорируются, за исключением случаев, когда значение заключено в двойные кавычки (тут оно сохраняется в массив "как есть").

Пока в стиле "что вижу, то и пою" придумал следующую функцию:
<?php
    
function strparse($str) {
        
$a = array();
        
$t '';
        
$n '';
        
# ключ "кавычки открыты"
        
$quot FALSE;
        for (
$i=0$i strlen($str); $i++) {
            if (
$str[$i] == '"') {
                
$quot = !$quot;
                continue;
            }
            if (!
$quot && ($str[$i] == ' '))
                continue;
            
# если кавычки открыты  - однозначно записываем символ во врем.переменную
            
if ($quot) {
                
$t.= $str[$i];
                continue;
            }
            
# если "=", то это завершено чтение имени переменной
            
if ($str[$i] == '=') {
                
$n strtolower($t);
                
$t '';
                continue;
            }
            
# если ",", то это завершено чтение значения переменной
            
if ($str[$i] == ',') {
                
$v $t;
                
$t '';
                
# если есть имя переменной, то сохраняем значение под ним,
                # иначе сохраняем без имени (под очередной цифрой: 0,1,...)
                
if ($n != '')
                    
$a[$n] = $v;
                else
                    
$a[] = $v;
                
$n '';
                
$v '';
                continue;
            }
            
$t.= $str[$i];
        }
        if (
$t != '') {
            if (
$n != '')
                
$a[$n] = $t;
            else
                
$a[] = $t;
        }
        return 
$a;
    }
?>

   
 
 автор: Волки   (25.01.2008 в 11:12)   письмо автору
 
   для: Timofeich   (25.01.2008 в 00:07)
 

есть стандартная ф-ция: parse_str($str); //см help
у которой нету всех тех примочек что вам нужны

   
 
 автор: Timofeich   (25.01.2008 в 18:10)   письмо автору
 
   для: Волки   (25.01.2008 в 11:12)
 

Да, parse_str() - эквивалентная функция. Вот только значения без заданного имени не обрататывает и разделение переменных иным символом.
Может, есть предложения просто упростить мой код?

   
Rambler's Top100
вверх

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