使用mysql查询通过unserialize()函数获取所有数组值


get all array values by unserialize() function with mysql query

如何从这个数组中获取$userid和$username的所有值

a:1:{s:2:"cc";a:2:{i:4;s:4:"koko";i:8;s:4:"soso";}}

我的代码只打印最后一个字符串,我想将所有值作为数组,并在循环上打印所有值

$touser = array();
$sql = $db->query_read("SELECT touserarray FROM " . TABLE_PREFIX . " pmtext where pmtextid = 147 ");
while ($sql1 = $db->fetch_array($sql)) 
{ 
    $touser = unserialize($sql1['touserarray']);
    foreach($touser AS $key => $item)
    {
        if (is_array($item))
        {
            foreach($item AS $subkey => $subitem)
            {
                $username = $subitem;
                $userid = $subkey;
            }
        }
        else
        { 
            $username = $item;
            $userid = $key[$i];
        }
    }
}
echo $username .'<br />'. $userid ;

当我打印$username和$userid时仅打印姓氏和最后id//输出用户名:sosouserid:8

如果你想打印或存储数据,你需要为它创建一个新的数据结构。如果你只想打印数据,你必须在设置$username$userid的循环中完成;否则,每次运行循环时都会覆盖这些值。

# create an array for storing user names and IDs.
$user_arr = array();
foreach($touser as $key => $item)
{
    if (is_array($item))
    {
        foreach($item AS $subkey => $subitem)
        {
            $username = $subitem;
            $userid = $subkey;
        }
    }
    else
    { 
        $username = $item;
        $userid = $key[$i];
    }
    # store the data as $user_arr[$id] = $name
    $user_arr[$userid] = $username;
    # or if you just want to print off the data during the loop...
    echo "ID: $userid; name: $username" . PHP_EOL;
}
foreach ($user_arr as $k => $v) {
    echo "id: $k; name: $v" . PHP_EOL;
}

输出:

id: 4; name: koko
id: 8; name: soso

您不会在任何地方保存值,因此useridusername每次都会覆盖。试试这个:

<?php
    $touser = array();
    $sql = $db->query_read("SELECT touserarray FROM " . TABLE_PREFIX . " pmtext
                        where pmtextid = 147 ");
    while ($sql1 = $db->fetch_array($sql)) {
        $touser = unserialize($sql1['touserarray']);
        foreach($touser AS $key => $item) {
            if (is_array($item)) {
                foreach($item AS $subkey => $subitem) {
                    $username = $subitem;
                    $userid = $subkey;
                    echo $userid . '/' . $username;
                }
            }
            else {
                $username = $item;
                $userid = $key;
                echo $userid . '/' . $username;
            }
        }
    }
?>

您的序列化数组的形式如下:

array(1) {
  'cc' =>
  array(2) {
    [4] =>
    string(4) "koko"
    [8] =>
    string(4) "soso"
  }
}

您需要再迭代一次("cc"键的itemCC):

    foreach ($touser as $itemCC) {
        foreach ($itemCC AS $key => $item) {
            if (is_array($item)) {
                foreach ($item AS $subkey => $subitem) {
                    $username = $subitem;
                    $userid = $subkey;
                }
            } else {
                $username = $item;
                $userid = $key;
            }
            $result[$userid] = $username;
        }
    }
// print result
foreach ($result as $userId => $username) {
    echo  $userId . " " . $username  . "<br />'n";
}

例如,$result变量是一个数组,其形式为userid=>$username。