Как отобразить несериализованные данные в php, когда в массиве несколько значений - PullRequest
0 голосов
/ 26 июня 2018

У меня есть страница, которая показывает данные из базы данных, в которой есть несериализованные данные. Несериализованные данные выглядят так:

array (
  'text-name' => 'test',
  'email' => 'test@gmail.com',
  'text-company' => 'test',
  'tel-number' => '978456132',
  'products' => 
  array (
    0 => 'Domains',
    1 => 'Weebly',
  ),
  'menu-country' => 'Austria',
  'number' => '1001 - 10,000',
  'text-current-registrar' => '5',
  'notes' => 'test',
  'text-current-url' => 'https://www.foo.com/boo-foo/',
  'text-previous-url' => 'https://www.foo.com/boo-foo/',
  'text-utm_source' => '',
  'text-utm_medium' => '',
  'text-utm_campaign' => '',
  'gdpr-b' => 
  array (
    0 => 'I',
  ),
  'gdpr-c' => 
  array (
    0 => 'I',
  ),
  'gdpr-d' => NULL,
  'gdpr-e' => NULL,
)

данные в БД имеют следующий формат: 'a:18:{s:9:"text-name";s:4:"test";s:5:"email";s:14:"test@gmail.com";s:12:"text-company";s:4:"test";s:10:"tel-number";s:9:"978456132";s:8:"products";a:2:{i:0;s:7:"Domains";i:1;s:6:"Weebly";}s:12:"menu-country";s:7:"Austria";s:6:"number";s:13:"1001 - 10,000";s:22:"text-current-registrar";s:1:"5";s:5:"notes";s:4:"test";s:16:"text-current-url";s:59:"https://www.bla.com/foo-bar/";s:17:"text-previous-url";s:59:"https://www.bla.com/foo-bar/";s:15:"text-utm_source";s:0:"";s:15:"text-utm_medium";s:0:"";s:17:"text-utm_campaign";s:0:"";s:6:"gdpr-b";a:1:{i:0;s:1:"I";}s:6:"gdpr-c";a:1:{i:0;s:1:"I";}s:6:"gdpr-d";N;s:6:"gdpr-e";N;}'

код php для отображения выглядит следующим образом:

<?php
        $no     = 1;        
        while ($row = mysqli_fetch_array($query))
        {           
            echo '<tr>';
            echo '<td>'.$no.'</td>';
            echo '<td>'.$row['form'].'</td>';           
             $formdata = unserialize($row['data']);
            foreach ($formdata as $key => $fdata)
            {
                if( sizeof($fdata) !=1  ) 
                {
                    if (is_array($fdata)) {
                        $fsofdata = array_map('unserialize', $fdata);
                        foreach ($fsofdata as $prod => $prodvalue)
                        {
                            if ( ($prod === 'gdpr-b') || ($prod === 'gdpr-c') || ($prod === 'gdpr-d') || ($prod === 'gdpr-d')  ) {
                                foreach ($prodvalue as $pprod => $pprodvalue)
                                {
                                    echo '<td>'.$pprod.''.($pprodvalue).'</td>';
                                }
                            }
                            else {


                            echo '<td>'.($prodvalue).'</td>';
                            }
                        }
                    }
                    else {
                        echo '<td>'.($fdata).'<td/>';
                    }
                }
                else {
                    echo '<td>'.($fdata).'<td/>';                                                   
                }
            }
            echo '<td>'.$row['date']. '</td>';                  
            echo '</tr>';           
            $no++;
        }
?>

Проблема здесь в том, что данные, которые присутствуют внутри массива продуктов и переменных gdpr-b, gdpr-c, отображаются в виде массива. Я пытался использовать array_map для данных, но это тоже не помогло, как отобразить значения в массив в таблице.

1 Ответ

0 голосов
/ 26 июня 2018

serialize() и unserialize() являются двойными - то есть, если у вас есть массив и его сериализован, то unserialize вернет вам точно такой же массив (включая все вложенные подмассивы). Однако, если ваш исходный массив содержал элементы, которые являются сериализацией других массивов (то есть эти элементы в настоящее время являются строками) - вам придется перебирать массив 1-го уровня и десериализовать каждый отдельный элемент. Наилучший подход состоит в том, чтобы сериализовать только массив верхнего уровня в целом, а не каждый его элемент. И если ваш массив не содержит объектов - гораздо лучше использовать json_encode и json_decode

...