2013-03-27 9 views
0

я есть текст со многими линиями, как это:PHP Отдельные строки в переменные

(item (Index Value) (Name Value)(Name2 Value2)(Name3 Value3) (Speciality (Name-a value-a) (Name-b value-b)) 

Реальный пример:

(item(name 256)(Index 1)(Image "Wea001")(Action 1 1)(class weapon sword)(code 1 1 1 1)(country 2)(level 1)(wear 1) (limit Knight 1)(range 16)(buy 4)(sell 1)(endurance 4)(specialty(aspeed 700)(Attack 3 10)(hit 15))) 

Теперь я хочу, чтобы сохранить их в массив $ Items [$ Index] - Значение индекса - это (индекс XX) в строке -

и в каждом значении новый массив содержит значения в этом, например (с использованием реальной строки)

$Items[1]{ 
$Name => 256, 
$Image => 'Wea001', 
$Action=> '1 1', 
$class => 'weapon sword', 
...etc 
} 

я уже спас их в основной массив с помощью взрываются, но используя значения по умолчанию 0,1,2,3, .. и т.д. не индекс линии

$items = explode('<br />', $inititemcontent); 
for($i = 0; $i < count($items); $i++){ 
    echo "$items[$i] <br />"; 
} 

PS: значение индекса никогда не повторяется, никогда не может быть двух строк с тем же индексом PPS: обычно не все мелкие теги (значение имени) существуют, иногда все они, а иногда только некоторые.

+1

Почему t он данные в этом формате в первую очередь? Кроме того, ваши данные не совпадают с примером. – Daedalus

+0

Его файл данных, используемый в игре как C++, я хочу использовать его с PHP, поэтому я могу справиться с этим, его же пример: главный тег (item), а в нем есть небольшие теги (NameOfTheTag ItsValue), также есть один из тегов под названием Specialty, которые включают более мелкие теги:/ –

ответ

0

Я заметил, что формат исходного файла был похож на JSON после того, как я написал первый ответ, поэтому я написал это:

<?php 
    $string = '(item(name 256)(Index 1)(Image "Wea001")(Action 1 1)(class weapon sword)(code 1 1 1 1)(country 2)(level 1)(wear 1) (limit Knight 1)(range 16)(buy 4)(sell 1)(endurance 4)(specialty(aspeed 700)(Attack 3 10)(hit 15)))'; 



    $patterns = array(
    '!\(!', 
    '!\)!', 
    '!\{([^\{}]+)\{!', 
    '!\},\},\}!', 
    '!\},([^}])!', 
    '!\{([^ ]+) ([^}]+)\}!', 
    '!"!', 
    "!'!", 
    "!\}(,)?!", 
    "!\},$!", 
    ); 
    $replacements = array(
    "{", 
    "},", 
    "{\"$1':[\n{'", 
    "}]}]}", 
    "},\n$1", 
    "{'$1':'$2'}", 
    '', 
    '"', 
    "}$1\n", 
    "}" 
    ); 

    $string = preg_replace($patterns,$replacements,$string); 
    //print $string; 
    $items = json_decode($string,true); 

    print_r($items); 

    ?> 

Источник выходного сигнала выглядит следующим образом:

Array 
    (
     [item] => Array 
      (
       [0] => Array 
        (
         [name] => 256 
        ) 

       [1] => Array 
        (
         [Index] => 1 
        ) 

       [2] => Array 
        (
         [Image] => Wea001 
        ) 

       [3] => Array 
        (
         [Action] => 1 1 
        ) 

       [4] => Array 
        (
         [class] => weapon sword 
        ) 

       [5] => Array 
        (
         [code] => 1 1 1 1 
        ) 

       [6] => Array 
        (
         [country] => 2 
        ) 

       [7] => Array 
        (
         [level] => 1 
        ) 

       [8] => Array 
        (
         [wear] => 1 
        ) 

       [9] => Array 
        (
         [limit] => Knight 1 
        ) 

       [10] => Array 
        (
         [range] => 16 
        ) 

       [11] => Array 
        (
         [buy] => 4 
        ) 

       [12] => Array 
        (
         [sell] => 1 
        ) 

       [13] => Array 
        (
         [endurance] => 4 
        ) 

       [14] => Array 
        (
         [specialty] => Array 
          (
           [0] => Array 
            (
             [aspeed] => 700 
            ) 

           [1] => Array 
            (
             [Attack] => 3 10 
            ) 

           [2] => Array 
            (
             [hit] => 15 
            ) 

          ) 

        ) 

      ) 

    ) 
1

Будет что-то вроде этой работы? Поскольку на примере есть только одна строка, у меня не так много было.

<?php 
    $string = '(item(name 256)(Index 1)(Image "Wea001")(Action 1 1)(class weapon sword)(code 1 1 1 1)(country 2)(level 1)(wear 1) (limit Knight 1)(range 16)(buy 4)(sell 1)(endurance 4)(specialty(aspeed 700)(Attack 3 10)(hit 15)))'; 

    preg_match_all('!\([^()]+\)!s',$string,$parts); 

    $items = array(); 


    foreach($parts as $index=>$temp_array){ 
     foreach($parts[$index] as $key=>$component){ 
      $component = preg_replace('![()]!','',$component); 
      preg_match_all('!([^ ]+) ([^)]+)!',$component,$component_parts); 

      $temp_key = $component_parts[1][0]; 
      $temp_val = $component_parts[2][0]; 
      $items[$index][$temp_key]=$temp_val; 
     } 
    } 

    print_r($items); 

?> 

Выход выглядит следующим образом:

Array 
(
[0] => Array 
    (
     [name] => 256 
     [Index] => 1 
     [Image] => "Wea001" 
     [Action] => 1 1 
     [class] => weapon sword 
     [code] => 1 1 1 1 
     [country] => 2 
     [level] => 1 
     [wear] => 1 
     [limit] => Knight 1 
     [range] => 16 
     [buy] => 4 
     [sell] => 1 
     [endurance] => 4 
     [aspeed] => 700 
     [Attack] => 3 10 
     [hit] => 15 
    ) 

) 
+0

В качестве примечания, последние три должны быть вложенными. – Daedalus

+0

Ну, это усложняет ситуацию. Вернуться к доске для рисования. –

+0

Являются ли они [items] разделенными новыми строками в коде или с запятой? –

Смежные вопросы