0

I am Trying to Convert JSON Data to CSV but it says that "Notice: Array to string conversion in D:\xampp\htdocs\api.pharmarack.com\Model\ConverterModel.php on line 427"

MyJSON:

[
    {
        "FirmId": "1",
        "OrderNo": "RP89",
        "PartyCode": "7026",
        "Status":"Processed",
        "InvoiceNo":"INV123",
        "InvoiceDate": "2017-12-02",
        "OrderDate": "2017-12-02 11:43:38.321813",
        "OrderDetails": [
            {
                "Item": "ZAART 50 MGTAB",
                "ItemDetailId": "22047",
                "OrderedQty": "17",
                "ProcessedQty":"17",
                "ProcessedPTR":"24.5",
                "ProcessedMRP":"30.5"
            },
            {
                "Item": "RBTONE CAPS",
                "ItemDetailId": "6091",
                "OrderedQty": "10",
                "ProcessedQty":"0",
                "ProcessedPTR":"0",
                "ProcessedMRP":"0"
            },
            {
                "Item": "EBASIL 20MG",
                "ItemDetailId": "80253",
                "OrderedQty": "20",
                "ProcessedQty":"15",
                "ProcessedPTR":"45.0",
                "ProcessedMRP":"50.0"
            }
        ]
    },
    {
        "FirmId": "1",
        "OrderNo": "RP88",
        "PartyCode": "7025",
        "Status":"Processed",
        "InvoiceNo":"INV123",
        "InvoiceDate": "2017-12-02",
        "OrderDate": "2017-12-02 11:31:13.307100",
        "OrderDetails": [
            {
                "Item": "BG PROT L",
                "ItemDetailId": "83570",
                "OrderedQty": "20",
                "ProcessedQty":"15",
                "ProcessedPTR":"45.0",
                "ProcessedMRP":"50.0"
            },
            {
                "Item": "E ZINT LIQ",
                "ItemDetailId": "88417",
                "OrderedQty": "20",
                "ProcessedQty":"15",
                "ProcessedPTR":"45.0",
                "ProcessedMRP":"50.0"
            },
            {
                "Item": "A TO Z DROP",
                "ItemDetailId": "98165",
                "OrderedQty": "20",
                "ProcessedQty":"15",
                "ProcessedPTR":"45.0",
                "ProcessedMRP":"50.0"
            }
        ]
    }
]

PHP CODE:

$fp = fopen($cfilename, 'w');
$data = json_decode($json, true);
$firstLineKeys = false;
foreach ($data as $line) {
    if (empty($firstLineKeys)) {
        $firstLineKeys = array_keys($line);
        fputcsv($fp, $firstLineKeys);
        $firstLineKeys = array_flip($firstLineKeys);
    }
    $line_array = array($line['FirmId'], $line['OrderNo'], $line['PartyCode'], $line['Status'], $line['InvoiceNo'], $line['InvoiceDate'], $line['OrderDate']);
    foreach ($line['OrderDetails'] as $valueItem) {
        $item_array = array($value['Item'], $value['ItemDetailId'], $value['OrderedQty'], $value['ProcessedQty'], $value['ProcessedPTR'], $value['ProcessedMRP']);
        array_push($line_array, $item_array);
    }
    fputcsv($fp, $line_array);
}

fclose($fp);

Expected Output: enter image description here

1
  • because you are trying to put order details array in csv, you can't put the array in csv Commented Dec 11, 2017 at 12:42

2 Answers 2

1

Hope this will help you:

<?php

$fp = fopen("demo.csv", 'w');
$data = json_decode($json, true);
$firstLineKeys = false;
foreach ($data as $line) {
    if (empty($firstLineKeys)) {
        $firstLineKeys = array_keys($line);
        $firstLineKeys = array_merge($firstLineKeys, array_keys($line['OrderDetails'][0]));
        unset($firstLineKeys['OrderDetails']);
        fputcsv($fp, $firstLineKeys);
        $firstLineKeys = array_flip($firstLineKeys);
    }
    $line_array = array($line['FirmId'], $line['OrderNo'], $line['PartyCode'], $line['Status'], $line['InvoiceNo'], $line['InvoiceDate'], $line['OrderDate']);
    foreach ($line['OrderDetails'] as $value) {
        $array = $line_array;
        array_push($array, $value['Item'], $value['ItemDetailId'], $value['OrderedQty'], $value['ProcessedQty'], $value['ProcessedPTR'], $value['ProcessedMRP']);
        fputcsv($fp, $array);
    }
}

fclose($fp);
Sign up to request clarification or add additional context in comments.

Comments

1

The problem seems to be in this, and then trying to put $line_array into csv...

foreach ($line['OrderDetails'] as $value) {
    array_push($line_array, $value);
}

From JSON structure, the $value in this loop is an array, because OrderDetails is array of objects. So value will be like:

            {
                "Item": "ZAART 50 MGTAB",
                "ItemDetailId": "22047",
                "OrderedQty": "17",
                "ProcessedQty":"17",
                "ProcessedPTR":"24.5",
                "ProcessedMRP":"30.5"
            }

After that you are putting multidimensional array into fputcsv:

fputcsv($fp, $line_array);

EDIT:

Change it for example to this:

foreach ($line['OrderDetails'] as $value) {
    $line_array = array_merge($line_array, array_values($value));
}

1 Comment

You are still pushing an array into $line_array. So your $line_array contains something like $line_array[0] = array(...) ... and it can't! fputcsv() excepts only array of strings... not array of arrays. You are probably looking for array_merge() instead of array_push(). Edited answer to show possible solution.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.