как взорваться в массив именованных переменных в php? - PullRequest
1 голос
/ 01 марта 2012

Я начал работать с php, и мне было интересно, можно ли было взорвать строку в массив с именованными переменными. Установлено, что у меня есть некоторые данные, которые я читаю из текстового файла, и я хочу сначала разбить их на строки, а затем разбить на отдельные фрагменты данных.

 Data1  |  Data2  |  Data3  |
 ----------------------------
|   x   |    y    |    z    |
|   p   |    q    |    r    |

Итак, я пытаюсь получить что-то вроде:

data {
   row1 {
       data1: x
       data2: y
       data3: z
   row2 {
       data1: p
       data2: q
       data3: r
   }
}

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

$r1d1 = data[row1]['data1'];

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Если вы хотите разбить строку в ассоциативный массив, вы можете использовать функцию списка.

// Initialize data_list
$data_list = array();

// Remove delimiter at start and end of string
$string = trim('|   x   |    y    |    z    |', '|');

$data = array();
list($data['data1'],$data['data2'],$data['data3']) = explode('|',$string);

$data_list[] = $data;

Вы хотели бы поместить ее в цикл foreach для обработки каждой строки файла.В конце $ data_list будет содержать все данные.

0 голосов
/ 01 марта 2012

Вы можете извлечь их PHP Extract ()

extract($your_array, EXTR_PREFIX_ALL, 'prefix_if_needed');

затем используйте

<code>    echo '<pre>'; 
      var_export(array_diff(get_defined_vars(), array(array())));  
    echo'
';

Чтобы увидеть ваши новые имена переменных;)

Надеюсь, это поможет.

0 голосов
/ 01 марта 2012

Объяснение по коду

<?php

// data to convert
$string = '| Data1  |  Data2  |  Data3  |
 ----------------------------
|   x   |    y    |    z    |
|   p   |    q    |    r    |';

// container to collect data in
$data = array();

// split the string into lines
$lines = explode("\n", $string);
// pull first line from the array
$names = array_shift($lines);
// remove delimiters from beginning and end
$names = trim($names, '| ');
// split at | while ignoring spaces and empty results
$names = preg_split('/\s*\|\s*/', $names);
// remove --------------- line
array_shift($lines);
// walk remaining lines
foreach ($lines as $line) {
    // container to collect data of row in
    $row = array();
    // remove delimiters from beginning and end
    $line = trim($line, '| ');
    // split at |
    $line = explode('|', $line);
    foreach ($line as $i => $value) {
        // identify key by looking up in $names
        $key = $names[$i];
        // remove spaces
        $row[$key] = trim($value);
    }
    // add row to data set
    $data[] = $row;
}

var_dump($data);

приведет к

$data = array(
    0 => array(
        'Data1' => 'x',
        'Data2' => 'y',
        'Data3' => 'z',
    ),
    1 => array(
        'Data1' => 'p',
        'Data2' => 'q',
        'Data3' => 'r',
    ),
);
...