简体   繁体   中英

Loop multidimensional array Laravel

Im having trouble looping an array in my laravel 5.5 blade

1.- In my controller Im querying a dynamodb and I'm returning $arrayRet

 $result =$dynamodb->query(array(
            'TableName' => 'sigfox',
            'KeyConditionExpression' => 'deviceid = :v_hash',
            'ExpressionAttributeValues' =>  array (
                ':v_hash'  => array('S' => '3E6231')
            )
        ));

        //echo "Query succeeded.\n";
        $arrayRet['signals'] = $result['Items'];
  return view('loggers.index', $arrayRet);

2.-In my blade I have the following code

 @foreach($signals as $signal)
        <tr>
            <td>{{$signal['payload']['M']['data']['S']}}</td>  
        </tr>
 @endforeach

3.- I get Undefined index: data --- So I've dd($signal) and this is the result

array:3 [▼
"payload" => array:1 [▼
      "M" => array:10 [▼
  "avgSnr" => array:1 [▶]
  "rssi" => array:1 [▶]
  "data" => array:1 [▼
    "S" => "33333b414900"
  ]
  "lng" => array:1 [▶]
  "snr" => array:1 [▶]
  "station" => array:1 [▶]
  "seqNumber" => array:1 [▶]
  "time" => array:1 [▶]
  "device" => array:1 [▶]
  "lat" => array:1 [▶]
   ]
   ]
"deviceid" => array:1 [▶]
"timestamp" => array:1 [▶]
]

4.- I also tried getting the value hardcoding the position and It works. But I have to use the "blade way" with @foreach

       <tr>
            <td>{{$signals[0]['deviceid']['S']}}</td>
            <td>{{$signals[0]['timestamp']['S']}}</td>
            <td>{{$signals[0]['payload']['M']['avgSnr']['S']}}</td>
            <td>{{$signals[0]['payload']['M']['snr']['S']}}</td>
            <td>{{$signals[0]['payload']['M']['lat']['S']}}</td>
            <td>{{$signals[0]['payload']['M']['lng']['S']}}</td>
        </tr>

5.- Maybe I'm missing something please advise

If you are using PHP 7 null coalescing operator can be very useful here!

@foreach(signals as signal)
   <tr>
        <td>{{ $signal['deviceid']['S'] ?? 'N/A' }}</td>
        <td>{{ $signal['timestamp']['S'] ?? 'N/A' }}</td>
        <td>{{ $signal['payload']['M']['avgSnr']['S'] ?? 'N/A' }}</td>
        <td>{{ $signal['payload']['M']['snr']['S'] ?? 'N/A' }}</td>
        <td>{{ $signal['payload']['M']['lat']['S'] ?? 'N/A' }}</td>
        <td>{{ $signal['payload']['M']['lng']['S'] ?? 'N/A' }}</td>
    </tr>
@endforeach

If the index doesn't exist, it will print "N/A" as a default value.

There can be more improvement! Create a model to clean up these indexes and everything before sending the view and the code will look something like this. In your controller, process this data before sending it to view. The function like array_map can be useful here. Logic staff should be done out of the views as much as possible. Your code will look much neater.

@foreach(signals as signal)
   <tr>
        <td>{{ $signal['deviceid'] }}</td>
        <td>{{ $signal['timestamp'] }}</td>
        <td>{{ $signal['avgSnr'] }}</td>
        <td>{{ $signal['snr'] }}</td>
        <td>{{ $signal['lat'] }}</td>
        <td>{{ $signal['lng'] }}</td>
    </tr>
@endforeach

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM