'Why do I have invalid argument supply for foreach in Laravel for json response? [duplicate]

I am working on Razorpay integration and after succesful payment when I try to save the details to the database I get an error. I am sending the details through AJAX and in controller when I try to use foreach and look in console I always get the error invalid argument supplied for foreach statement.

this is the script after successful transaction

<script>

    function demoSuccessHandler(transaction) {
        // You can write success code here. If you want to store some data in database.
        $("#paymentDetail").removeAttr('style');
        $('#paymentID').text(transaction.razorpay_payment_id);
        var paymentDate = new Date();
        $('#paymentDate').text(
                padStart(paymentDate.getDate()) + '.' + padStart(paymentDate.getMonth() + 1) + '.' + paymentDate.getFullYear() + ' ' + padStart(paymentDate.getHours()) + ':' + padStart(paymentDate.getMinutes())
                );

        $.ajax({
            method: 'post',
            url: "{!!route('dopayment')!!}",
            dataType:"json",
            data: {
                "_token": "{{ csrf_token() }}",
                "product": "{{ json_encode($product)}}",
                "Company": "{{ $company}}",
                "Address": "{{$address}}",
                "Contact": "{{$contact}}",
                "razorpay_payment_id": transaction.razorpay_payment_id
            },
            complete: function (r) {
                console.log('complete');
                console.log(r);
            }
        })
    }
</script>
<script>
    var options = {
        key: "{{ env('RAZORPAY_KEY') }}",
        amount: '{{ $subtotal}}',
        name: 'AMCOR RAZORPAY',
        description: 'AMCOR INTERNATIONAL',
        image: 'https://i.imgur.com/n5tjHFD.png',
        handler: demoSuccessHandler
    }
</script>

the controller function is

 public function dopayment(Request $request) {

            $input = $request->all();

            $product = $request->product;


            foreach ($product as $single) {
                # code...

                print_r($single->name);
            }

            print_r($product);
            exit;
        }


Solution 1:[1]

You may decode product string before loop through it

//...
$product  = json_decode($request->product, true);
//...

Solution 2:[2]

Please Json Decode before foreach loop

 public function dopayment(Request $request) {

            $input = $request->all();

            $product = json_decode($request->product);


            foreach ($product as $single) {
                # code...

                print_r($single->name);
            }

           print_r($product);
            exit;
        }

Solution 3:[3]

The error occurs because $product returns a single value instead of an array; a check will work in this case.

if (is_array($product ) || is_object($product ))
{
    foreach($product as $arrayItems){
      // Perform x.
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Foued MOUSSI
Solution 2 Paras Raiyani
Solution 3 Karl Hill