我有这个i数组,我尝试循环波谷。
Output of:<?php print_r($this);?>
[text] => a:2:{i:0;a:2:{s:5:"value";s:2:"de";s:5:"label";s:70:"<img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">";}i:1;a:2:{s:5:"value";s:2:"en";s:5:"label";s:70:"<img src="assets/images/7/en-c5c09767.jpg" width="40" height="28" alt="">";}}
我尝试过:
<?php $str ='de'; ?>
<?php foreach ($this->text as $key => $item):?>
<?php if ($key == $str):?>
<span class="firstelement hide-on-mobile"><?php echo $item; ?></span>
<?php endif;?>
<?php endforeach;?>
我没有输出。
答案 0 :(得分:2)
首先,您的阵列似乎已被序列化。要使用代码访问它,您首先需要unserialize()
。 (以防您尚未这样做)
$labels = unserialize($this->text);
然后出现的问题是,您误解了数组的结构。您的数组是这样构建的:
$labels = [
0 => [
'value' => 'de',
'label' => '<img ... />'
],
1 => [
'value' => 'en',
'label' => '<img ... />'
]
]
如您所见,它是一个包含数组本身的数组。 (多维数组)在您的for
循环中迭代数组时,$key
被分配了 outer 键,因此0
和1
被分配了。您想要的是访问内部键。这只能通过直接访问它们来完成:
for($labels as $value) {
if ($value['value'] === $str) {
?>
<span class="firstelement hide-on-mobile"><?= $value['label'] ?></span>
<?php
}
}
如您所见,for
循环不再访问外部键,因为它们不相关,也不会直接使用$value['value']
和$value['label']
访问内部数组的字段。
答案 1 :(得分:1)
您的$this->text
是serialize()
在PHP数组上运行的结果,大概是将其存储在表列中。因此,必须unserialized()
回到PHP数组,然后才能将其用作PHP数组。
但是,当我尝试在原始序列化中似乎也有错误时,$this->text
本身就已损坏且无法使用。
从问题中复制了序列化的字符串后,尝试对其进行反序列化时,出现此错误
$x = 'a:2:{i:0;a:2:{s:5:"value";s:2:"de";s:5:"label";s:70:"<img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">";}i:1;a:2:{s:5:"value";s:2:"en";s:5:"label";s:70:"<img src="assets/images/7/en-c5c09767.jpg" width="40" height="28" alt="">";}}';
$y = unserialize($x);
print_r($y);
注意:unserialize():在第4行的D:\ PHP-SOURCE \ tst.php中,偏移123为256个字节时发生错误
这是因为字符串的这一部分
s:70:"<img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">"
不能正确计算以下字符串,因为字符串中有74个字符
"<img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">"
如果我们通过这样将计数更正为74
来解决此问题
s:74:"<img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">"
然后重新运行反序列化
$x = 'a:2:{i:0;a:2:{s:5:"value";s:2:"de";s:5:"label";s:74:"<img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">";}i:1;a:2:{s:5:"value";s:2:"en";s:5:"label";s:70:"<img src="assets/images/7/en-c5c09767.jpg" width="40" height="28" alt="">";}}';
$y = unserialize($x);
print_r($y);
字符串计数中还有另一个类似错误
注意:unserialize():在第8行的D:\ PHP-SOURCE \ tst.php中,偏移量256为256个字节时出错
s:70:"<img src="assets/images/7/en-c5c09767.jpg" width="40" height="28" alt="">"
因此,如果我们也通过计数74
来解决该错误,然后重新运行
$x = 'a:2:{i:0;a:2:{s:5:"value";s:2:"de";s:5:"label";s:74:"<img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">";}i:1;a:2:{s:5:"value";s:2:"en";s:5:"label";s:74:"<img src="assets/images/7/en-c5c09767.jpg" width="40" height="28" alt="">";}}';
$y = unserialize($x);
print_r($y);
我们得到了这样的正确非序列化数组
Array
(
[0] => Array
(
[value] => de
[label] => <img src="assets/images/e/de-02d3d6ee.jpg" width="40" height="28" alt="">
)
[1] => Array
(
[value] => en
[label] => <img src="assets/images/7/en-c5c09767.jpg" width="40" height="28" alt="">
)
)
简而言之,如果您是从数据库中获得此数据的,则需要先查看对这些数据进行序列化的代码,然后再将其放置在数据库中,以弄清为何错误地进行序列化首先是数组。