Экспорт ответа API в CSV - PullRequest
1 голос
/ 08 мая 2020

Мне нужно экспортировать ответ API в файл CSV. На данный момент я могу экспортировать его, и результат выглядит как l oop (в моем ответе API 8 элементов со статусом). Когда я проверяю свой CSV-файл, он содержит 5 строк с аналогичным выводом, в которых доставляются только последние данные о статусе. Где мои ошибки, может кто поможет? : /

CSV для запроса API:

 - Tracking #,Order #,Unique ID
 - AB74832493,0dajKDhsa,478324
 - CD78437294,kDHIdsan98,768542

Ответ API:

Array
(
    [status] => delivered
    [last_trace] => 2020-04-21 13:10:00 : Shipment Delivered
    [last_action_date_time] => 2020-04-21 13:10:12
)

Array
(
    [status] => delivered
    [last_trace] => 2020-02-29 12:55:00 : Shipment Delivered
    [last_action_date_time] => 2020-02-29 12:55:51
)

Контроллер:

public function getstatusbyid()
    {

    $csv_file = file('C:\wamp64\www\testing\application\csv\packet.csv');
    $csv_data = [];
    foreach ($csv_file as $line) {
        $csv_data[] = str_getcsv($line);
    }

    $order_no = json_encode(array_column($csv_data, '0'));
    $tracking = json_encode(array_column($csv_data, '1'));
    $unique_id = array_column($csv_data, '2');
    $access_key = 'SOMETHING';

    foreach ($unique_id as $i => $id) {
        $url = "https://track.my/api/getstatus/$id";

        $data = array(
            'unique_id'       => $id,
            'access_key'      => $access_key
        );

        $data_string = json_encode($data);

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 15);

        $result = curl_exec($curl);

        curl_close($curl);

        $resultinfo = json_decode($result, true);
        echo '<pre>';
        print_r($resultinfo);

        $status = $resultinfo["status"];
        $date = $resultinfo["last_action_date_time"];

        $resultdata = array();
        if ($status == 'delivered') {
            foreach ($resultinfo as $item) {

                $resultdata[] = array(
                    'status'    => $status,
                    'date'      => $date
                );
            }


            $fp = fopen('C:\wamp64\www\testing\application\csv\track.csv', 'w');

            foreach ($resultdata as $fields) {
                fputcsv($fp, $fields);
            }

            fclose($fp);
        }
    }
}

1 Ответ

1 голос
/ 08 мая 2020

Проблема в том, что вы постоянно открываете (и воссоздаете) файл CSV. Вы можете изменить 'w' на 'a' на append , или даже лучше: переместить вызовы на fopen() и fclose() за пределы foreach ($unique_id as $i => $id) {, чтобы вы не открывали файл повторно каждый раз. время.

Пока вы занимаетесь этим, вы также должны проверить fopen() сбой.

public function getstatusbyid()
    {

    $csv_file = file('C:\wamp64\www\testing\application\csv\packet.csv');
    $csv_data = [];
    foreach ($csv_file as $line) {
        $csv_data[] = str_getcsv($line);
    }

    $order_no = json_encode(array_column($csv_data, '0'));
    $tracking = json_encode(array_column($csv_data, '1'));
    $unique_id = array_column($csv_data, '2');
    $access_key = 'SOMETHING';

    if ( FALSE === ( $fp = fopen('C:\wamp64\www\testing\application\csv\track.csv', 'w') ) ) {
        die( "Error opening CSV file." ); // TO DO: handle this better
    }

    foreach ($unique_id as $i => $id) {
        $url = "https://track.my/api/getstatus/$id";

        $data = array(
            'unique_id'       => $id,
            'access_key'      => $access_key
        );

        $data_string = json_encode($data);

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 15);

        $result = curl_exec($curl);

        curl_close($curl);

        $resultinfo = json_decode($result, true);
        echo '<pre>';
        print_r($resultinfo);

        $status = $resultinfo["status"];
        $date = $resultinfo["last_action_date_time"];

        $resultdata = array();
        if ($status == 'delivered') {
            foreach ($resultinfo as $item) {

                $resultdata[] = array(
                    'status'    => $status,
                    'date'      => $date
                );
            }

            foreach ($resultdata as $fields) {
                fputcsv($fp, $fields);
            }

        }
    }

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