PHP显示序列化数据的自定义结果

时间:2015-08-31 07:25:36

标签: php serialization

我使用serialize方法将数据插入数据库,如下所示:

a:1:{i:0;a:3:{
     i:0;s:14:"docs/name.docx";
     i:1;s:39:"docs/php-advanced-master.zip";
     i:2;s:39:"docs/php-master.zip";
}}

现在使用此功能,显示/打印文件名列表:

function _file_list_($id,$type){

    $files = DataAccess::fetch("SELECT * FROM " . NEWS_FILES . " WHERE news_id = ? AND type = ? ",$id , $type ); 

    if (count($files) > 0) {

        $list_files = unserialize($files[0]['url']);
            $count  =   count($list_files[0]);
            for($i=0; $i<$count; $i++){
                $files_show[]  =   array($list_files[0][$i]);
            }
        return $files_show;

        }
    else
    {
        return FALSE;
    }

}

这对我有用,结果是:

docs/name.docx
docs/php-advanced-master.zip
docs/php-master.zip

但是,我需要从列表中显示/打印docs/php-advanced-master.zip

我如何打印/显示此内容?

1 个答案:

答案 0 :(得分:1)

您可以使用array_walk并使用您需要的任何逻辑来仅显示您需要的文件。以下代码将调用您的函数并处理结果。它将检查列表中是否有带“php-advanced-master.zip”的文件名并输出。

$files = array_unique(_file_list_($id,$type), SORT_REGULAR);
array_walk_recursive($files, function ($value) {
    if (false !== stripos($value, "php-advanced-master.zip")) {
        echo $value;
    }
});

但是,如果要直接从SQL查询中过滤序列化数据。假设您的序列化数据存储在“url”字段中,您可以像这样修改您的函数:

function _file_list_($id,$type, $filenameFilter){

    $files = DataAccess::fetch("SELECT * FROM " . NEWS_FILES . " WHERE news_id = ? AND type = ? AND url like '%?%'",$id , $type, $filenameFilter); 

    if (count($files) > 0) {

        $list_files = unserialize($files[0]['url']);
            $count  =   count($list_files[0]);
            for($i=0; $i<$count; $i++){
                $files_show[]  =   array($list_files[0][$i]);
            }
        return $files_show;

        }
    else
    {
        return FALSE;
    }

}