9

I am sending data from my local machine to server using CURL. And the data is multidimensional array.

Array
(
[0] => stdClass Object
    (
        [id] => 1
    )
[1] => stdClass Object
    (
        [id] => 0
    )
[2] => stdClass Object
    (
        [id] => 11
    )
)

I am using this below code for sending the data.

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "my_url");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);  // $array is my above data

But at server when I try to put this incoming data to file or just print_r it gives me this below output

Array
(
[0] => Array
[1] => Array
[2] => Array
)

But I want the output in multidimensional.

I tried with print_r($_POST[0]) but it gives only Array text.

Yogesh Suthar
  • 29,554
  • 17
  • 66
  • 96

3 Answers3

25

cURL can only accept a simple key-value paired array where the values are strings, it can't take an array like yours which is an array of objects. However it does accept a ready made string of POST data, so you can build the string yourself and pass that instead:

$str = http_build_query($array);

...

curl_setopt($ch, CURLOPT_POSTFIELDS, $str);

A print_r($_POST) on the receiving end will show:

Array
(
    [0] => Array
        (
            [id] => 1
        )

    [1] => Array
        (
            [id] => 0
        )

    [2] => Array
        (
            [id] => 11
        )

)
MrCode
  • 59,851
  • 9
  • 76
  • 106
  • Thanks for answering, let you know when I will integrate this in my code. I have one more question ,I tried with sending array of array but at receiving end it gives the same output `Array ( [0] => Array [1] => Array [2] => Array )` – Yogesh Suthar Jan 31 '13 at 12:43
  • Yes, cURL can't take an array of arrays or an array of objects, it can only take a one dimensional array of strings, unless you build the post data manually (as in the answer). – MrCode Jan 31 '13 at 13:07
  • Thanks MrCode today I have implemented your code and now it is working as I wanted. Thanks again. – Yogesh Suthar Feb 12 '13 at 06:24
3

I would give a go to serialize and unserialize:

1) Before sending your array, serialize it (and set your transfer mode to binary):

(...)
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);           // need this to post serialized data
curl_setopt($ch, CURLOPT_POSTFIELDS, serialize($array));  // $array is my above data

2) When you receive the data, unserialize it:

$array = unserialize($_POST);

More details here and here

mika
  • 1,911
  • 3
  • 17
  • 31
  • great, but it didnt work this way, i had to `curl_setopt($ch, CURLOPT_POSTFIELDS, array('data'=>serialize($array)));` and then `$array = unserialize($_POST['data']);` – Valter Lorran Mar 07 '14 at 18:33
3
$param['sub_array'] = json_encode($sub_array);

and on the other side

$sub_array= json_decode($_POST['sub_array']);
Gianluca Demarinis
  • 1,666
  • 2
  • 11
  • 15