How to loop and get serialized values from database with php

3.6k views Asked by At

I'm developing a pizza's restaurant ecommerce and now I'm trying to get the size (Familiar) and the ingredients (Pernil dol�, Bac�, Emmental) of a pizza that was ordered previously. The data I want to get (the italic values in this paragraph) becomes serialized from database:

a:4:{s:10:"attributes";a:2:{s:6:"Tamany";a:1:{i:3;s:8:"Familiar";}s:11:"Ingredients";a:3:{i:318;s:12:"Pernil dol�";i:270;s:5:"Bac�";i:294;s:8:"Emmental";}}s:9:"shippable";s:1:"0";s:4:"type";s:5:"pizza";s:6:"module";s:10:"uc_product";}array(4) { ["attributes"]=> array(2) { ["Tamany"]=> array(1) { [3]=> string(8) "Familiar" } ["Ingredients"]=> array(3) { [318]=> string(11) "Pernil dol�" [270]=> string(4) "Bac�" [294]=> string(8) "Emmental" } } ["shippable"]=> string(1) "0" ["type"]=> string(5) "pizza" ["module"]=> string(10) "uc_product" }

I discovered 'unserialized' php method and I tried this:

$attr = $row['data']; // data from database
$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $attr); // I did this because I get some errors...

After I did that, I got this multidimensional array (a bit more human readable):

array(4) { ["attributes"]=> array(2) { ["Tamany"]=> array(1) { [3]=> string(8) "Familiar" } ["Ingredients"]=> array(3) { [318]=> string(11) "Pernil dol�" [270]=> string(4) "Bac�" [294]=> string(8) "Emmental" } } ["shippable"]=> string(1) "0" ["type"]=> string(5) "pizza" ["module"]=> string(10) "uc_product" }

Next step was try to loop the resulting data with a foreach loop, like the following:

foreach($data['attributes'] as $item)
  {
    print '<ul>';

    foreach($item as $value)
    {
        print_r('<li>' . $value . '</li>');
    }

    print '</ul>';
  }

I'm a php beginner PHP developer and I can't figure out how can I loop this array in order to get the values I need. I'm getting this error:

Warning: Invalid argument supplied for foreach() in /home/my_host/public_html/dev.mysite.com/inc/file.php on line 79

Can anybody tell me how I have to loop this array to get the data? Any help will be very, very appreciated.

Best regards,

3

There are 3 answers

0
Gregory Hart On BEST ANSWER

I created this example for you. First I declared an array which believe mimics the array you have to parse. Then I looped through and outputed the contents of the array.

<?php

$array = array(
    0 => array(
        '0' => 'John Doe',
        '1' => '[email protected]'
    ),
    1 => array(
        '0' => 'Jane Doe',
        '1' => '[email protected]'
    ),
);  

foreach ($array as $key => $value) {

    $thisArray = $array[$key];

    print_r('<ul>');
    foreach ($thisArray as $key2 => $value){
      print_r('<li>'.$thisArray[$key2].'</li>');
    }
    print_r('</ul>');
}
?>
0
donbuche On

Finally, and based on the answer of @Gregory Hart, I reached my goal. This is the final code that makes it possible in my particular case:

$data = $row['data'];
  $attrib = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $data);
  $attr = unserialize($attrib);

  foreach ($attr as $key => $value)
  {
      print_r('<ul>');
      $thisArray = $attr[$key];

      foreach ($thisArray as $key2 => $value2)
      {
        print_r('<li>' . $key2 . ': ');
        $thisArray2 = $attr[$key][$key2];

        foreach ($thisArray2 as $key3 => $value3)
        {
          if ($key2 == 'Tamany')
            print_r('<span class="label label-warning">' . utf8_encode($thisArray2[$key3]) . '</span> ');
          if ($key2 == 'Ingredients')
            print_r('<span class="label label-success">' . utf8_encode($thisArray2[$key3]) . '</span> ');
          if ($key2 == 'Salsa')
            print_r('<span class="label label-primary">' . utf8_encode($thisArray2[$key3]) . '</span> ');
        }
        print '</li>';
      }
      print_r('</ul>');
  }

Thanks for you help!

0
JWC May On

Try this logic:

   $data_unserialize = unserialize($row->data);
    foreach ($data_unserialize as $data_key => $data_value) {
    if($data_key =='size')
{

$thisArray = $data_unserialize[$data_key ];

   foreach ($thisArray as $key2 => $value2){

   if($key2=='attributes')
   {
    switch ($value2) 
    {
      case "Pernil dol�":
         echo'Pernil dol �';
        break;
      case "Emmental":
        echo'Emmental';
        break;
 
      default:
        echo 'Nothing';
     }
    }

   }
   }
                                         
  }

NB:- And remove the break; from switch statement to display all ingrediants.