Ассоциативный цикл - PullRequest
       7

Ассоциативный цикл

0 голосов
/ 02 октября 2018

У меня был этот массив, и я пытаюсь зациклить корыто.

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 голосов
/ 02 октября 2018

Ваш $this->text является результатом запуска serialize() в массиве PHP, предположительно для сохранения его в столбце таблицы.Поэтому он должен быть unserialized() обратно в массив PHP, прежде чем вы сможете использовать его в качестве массива PHP.

Однако, когда я попытался это сделать, в исходной сериализации также возникают ошибки, так какis $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 (): ошибка по смещению 123 из 256 байтов в D: \ PHP-SOURCE \ tst.php в строке 4

Это потому, что эта часть строки,

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 (): Ошибка по смещению 248 из 256 байтов в D: \ PHP-SOURCE \ tst.php в строке 8

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

)

Короче говоря, если вы получили этоданные из базы данных Вам нужно будет посмотреть код, который сериализует эти данные, прежде чем они будут помещены в базу данных, чтобы понять, почему они неадекватно сериализуют массив в первую очередь.

0 голосов
/ 02 октября 2018

Прежде всего, ваш массив выглядит сериализованным.Чтобы получить к нему доступ с помощью кода, сначала необходимо unserialize().(Если вы этого еще не сделали)

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

Проблема, с которой вы столкнулись, заключается в том, что вы неверно истолковали структуру вашего массива.Ваш массив построен следующим образом:

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

Как видите, это массив, который содержит сами массивы.(многомерный массив) Когда массив повторяется в цикле for, $key назначаются внешние ключи, поэтому 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'] напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...