今天我有一个非常奇怪的问题。我有一个看起来像这样的序列化数组:
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中它就不再起作用了。
答案 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;
}
那应该让你开始......