【问题标题】:Associative array loop关联数组循环
【发布时间】:2019-03-07 08:18:56
【问题描述】:

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

我没有输出。

【问题讨论】:

  • 您似乎忘记包含您的问题,当您尝试它时会发生什么?您收到任何错误消息吗?
  • @LuckyStarr $this-&gt;text 不是关联数组,他只是认为它是。而是一个多维数组
  • @LuckyStarr 你标记为重复的问题也与他想要的无关,即使它是一个关联数组。

标签: php arrays loops


【解决方案1】:

首先,您的数组似乎是序列化的。要使用代码访问它,您需要先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'] 访问内部数组的字段。

【讨论】:

  • 您好,除了在序列化数据时似乎没有正确完成序列化。请参阅我的答案以获得解释
  • 这很奇怪,我在尝试反序列化时遇到错误。没关系,我玩得很开心:)
  • 我没有收到任何错误 :) $this->text 是我使用的 cms 得到的。
【解决方案2】:

您的$this-&gt;text 是在PHP 数组上运行serialize() 的结果,大概是将其存储在表列中。因此,它必须是 unserialized() 返回 PHP 数组,然后才能将其用作 PHP 数组。

但是,当我尝试原始序列化中似乎也存在错误时,$this-&gt;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 中 256 个字节的偏移 123 处出错

这是因为这部分字符串,

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 个字节的偏移 248 处出错

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="">
        )

)

因此,简而言之,如果您从数据库中获取此数据,您需要先查看序列化此数据的代码,然后再将其放入数据库中,以了解为什么它错误地序列化首先是数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多