关联数组循环

时间:2018-10-02 08:11:24

标签: php arrays loops

我有这个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;?>

我没有输出。

2 个答案:

答案 0 :(得分:2)

首先,您的阵列似乎已被序列化。要使用代码访问它,您首先需要unserialize()。 (以防您尚未这样做)

$labels = unserialize($this->text);

然后出现的问题是,您误解了数组的结构。您的数组是这样构建的:

$labels = [
    0 => [
        'value' => 'de',
        'label' => '<img ... />'
    ],
    1 => [
        'value' => 'en',
        'label' => '<img ... />'
    ]
]

如您所见,它是一个包含数组本身的数组。 (多维数组)在您的for循环中迭代数组时,$key被分配了 outer 键,因此01被分配了。您想要的是访问内部键。这只能通过直接访问它们来完成:

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->textserialize()在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="">
        )

)
  

简而言之,如果您是从数据库中获得此​​数据的,则需要先查看对这些数据进行序列化的代码,然后再将其放置在数据库中,以弄清为何错误地进行序列化首先是数组。