выровнять многомерный массив в текст CSV с помощью PHP - PullRequest
2 голосов
/ 06 июля 2011

Я знаю, что об этом спрашивали довольно много раз, но это немного извращение.

У меня есть многомерный массив, в котором ключом массива должно быть имя столбца для плоской строки типа csv (я не хочу, чтобы это был файл, просто как строка csv).

Итак, это так:

$data = array(
                dates = array ('2010-01-02','2011-02-03','2011-02-04'),
                type1 = array ('data1','data2','data3'),
                type2 = array ('data4','data5','data6')
);

Конечный результат должен быть:

$new_data  = "dates,type1,type2" . "\n"
$new_data .= "2010-01-02,data1,data4" . "\n"
$new_data .= "2011-02-03,data2,data5" . "\n"
$new_data .= "2011-02-04,data3,data6";

Надеюсь, это понятно. Спасибо за любую помощь.

Ответы [ 4 ]

1 голос
/ 06 июля 2011

Что-то вроде этого, вероятно, приблизится к тому, что вы хотите (не проверено, просто сходит с моей головы):

$fh = fopen('file.csv', 'w');

// write out the headers
fputcsv($fh, array_keys($data));

// write out the data    
for ($i = 0; $i < count($data['dates']); $i++) {
    $temp = array($data['dates'][$i], $data['type1'][$i], $data['type2'][$i]);
    fputcsv($fh, $temp);
}
0 голосов
/ 06 июля 2011

Это то же самое, что предложил Марк Б., однако вы написали, что не хотели создавать файл для этого. Поток Обертки на помощь (не проверял, просто схожу с макушки):

$fh = fopen('php://memory', 'rw'); # don't create a file, write to memory instead

// write out the headers
fputcsv($fh, array_keys($data));

// write out the data    
for ($i = 0; $i < count($data['dates']); $i++) {
    $temp = array($data['dates'][$i], $data['type1'][$i], $data['type2'][$i]);
    fputcsv($fh, $temp);
}
rewind($fh);
$string = stream_get_contents($fh);
fclose($fh);
0 голосов
/ 06 июля 2011

Я сделал небольшой урок для этого: https://gist.github.com/981720

Вы можете включить его и сгенерировать CSV следующим образом:

CSV::export($field_names, $data, '', TRUE)

0 голосов
/ 06 июля 2011

Это намного более многословно, чем вам когда-либо понадобится, но оно позволяет вам иметь массив из n элементов. zip основан на одноименной функции Python. Я не написал это.

$data = ($data);
$r = (call_user_func_array('zip', $data));

$fin = "";
$fin .= implode(',',array_keys($data)).PHP_EOL;
foreach($r as $arr)
{
    $fin .= implode(',',$arr).PHP_EOL;
}

// $fin now holds all the data. Do something with it and you're finished!

function zip() {
    $args = func_get_args();
    $zipped = array();
    $n = count($args);
    for ($i=0; $i<$n; ++$i) {
        reset($args[$i]);
    }
    while ($n) {
        $tmp = array();
        for ($i=0; $i<$n; ++$i) {
            if (key($args[$i]) === null) {
                break 2;
            }
            $tmp[] = current($args[$i]);
            next($args[$i]);
        }
        $zipped[] = $tmp;
    }
    return $zipped;
}

(проверьте разговор в комментариях. Это действительно актуально.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...