Unserialsed Array提供最奇怪的结果

时间:2015-04-21 15:11:15

标签: php arrays

今天我有一个非常奇怪的问题。我有一个看起来像这样的序列化数组:

a:4:{i:0;s:7:"Perfect";i:1;s:10:"jawel hoor";i:2;s:14:"Ach jawohl joh";i:3;s:2:"Ja";}

然后我执行此代码后:

include '../../database/connect.php';   
Class Calc {
    function getPrice($id) {
        $Db = new Db();
        $sth = $Db->dbh->prepare("SELECT * FROM orders WHERE id = :id");
        $sth->execute(array(':id'=>$id));


        $are_you_serial = $sth->fetchAll();
        foreach($are_you_serial as $row) {
            $serialised = $row['reply_array'];
            $product_id = $row['product_id'];
            $user_id = $row['user_id'];
        }
        $array = unserialize($serialised);
        foreach($array as $row) {
            echo $row[1];
        }

    }
}
$calc = new Calc();
$calc->getPrice(11);
eaca出来了。当我拨打第0行时,PjAJ出来了。 当我调用第2行时,这似乎是错误:

rwh
Notice: Uninitialized string offset: 2 in index.php on line 29

如果我只是print_r $ array:

,这就是数组的样子
Array
(
   [0] => Perfect
   [1] => jawel hoor
   [2] => Ach jawohl joh
   [3] => Ja
)

我也可以调用$ array [0]它会显示正确的东西,但是一旦我把它放在foreach中它就不再起作用了。

1 个答案:

答案 0 :(得分:1)

您的第一个foreach会不断重新分配变量,因此$serialised(应该是$serialized BTW)只会在您实际调用时保留最后一行的值{ {1}}。我会添加我认为你想要的内容,但是现在,还有一些更详细的信息,说明为什么你会得到“怪异的”或意外的输出:

关于如何阅读PHP序列化格式的一些信息:

unserialize
  • a:4:{i:0;s:7:"Perfect";i:1;s:10:"jawel hoor";... :接下来是一个数组,包含4个键值对
  • a:4:{:一个整数,值为0.因为这是数组的一部分,所有奇数值都是键,偶数值是值,所以数组的第一个索引是0
  • i:0;:一个字符串,7个字符长,字符串本身是“完美”(不带引号)

同样适用于序列化的对象:

s:7:"Perfect";
  • O:8:"stdClass":2:{s:3:"bar";i:123;s:3:"foo";i:456;} :一个对象,其类名为8个字符长(o:8:"stdClass":2:{),设置了2个属性
  • stdClass:属性名称是一个3字符长的字符串(“bar”),其值为int( 123
  • s:3:"bar";i:123;:3-char long属性(“foo”),值 456
  • s:3:"foo";i:456;:序列化对象的结束

知道了这一点,你应该能够在你反序列化之后弄清楚你正在使用的数据,即:

}

只是所有错误的阴影,foreach ($array as $row) { echo $row[1]; } 的值将是一个字符串,并且可以获得字符串的索引/偏移量(最好使用$row表示法,如{{1 }},但它会在偏移{}处返回字符,其中$row{1}是括号之间的数字/键。字符串与数组一样,零索引BTW,因此n将回显“f”,而n将回显“o”。< / p>

你想要的是,然后写:

$string = 'foo'; echo $string{0};

或更短:

echo $string{1};

就像我刚开始说的那样,你只是真正处理最后一个序列化的值,你真正想要的可能更像是这样:

foreach ($array as $row) {
    echo $row;
}

那应该让你开始......