json как да изведем данни от мултимасив

Ticketa

Registered
Привет отново малко бъгнах хахахах,
имам колона `post_settings` в тази колона (до сега) имах обикновен масив от вида на:

{
"status": "is_public",
"avatar":"https://www.gravatar.com/avatar/64e1b8d34f425d19e1ee2ea7236d3028?s=80&d=identicon&r=g",
"cover":""
}


Обаче, днес добавих нов параметър с масив "social_link":
JSON:
{

    "status":"is_public",
    "avatar":"https://www.gravatar.com/avatar/64e1b8d34f425d19e1ee2ea7236d3028?s=80&d=identicon&r=g",
    "cover":"",
    "social_link":[
        {
            "social_fb":"https://facebook.com/link",
            "count":"9"
        },
        {
            "social_tw":"",
            "count":"14"
        }
    ]

}

Като цяло проблема ми е, че не успявам да изведа информацията за social_fb и social_tw

Опитвам по следния начин:
PHP:
<?php if((json_decode($data->channel->channel_settings)->social_link ?? null) && (json_decode($data->channel->channel_settings)->social_link != '')): ?>
<h5>Връзки</h5>
<p>
    <?php foreach ((json_decode($data->channel->channel_settings)->social_link) as $RowSocialLink): ?>
        <?php if($RowSocialLink->social_fb != NULL): ?>
            <a href="<?= $RowSocialLink->social_fb; ?>"><i class="fa fa-facebook-square" style="font-size:36px"></i></a>
        <?php endif; ?>
        <?php if($RowSocialLink->social_tw != NULL): ?>
            <a href="<?= $RowSocialLink->social_tw; ?>"><i class="fa fa-twitter-square" style="font-size:36px"></i></a>
        <?php endif; ?>
    <?php endforeach; ?>
</p>
<?php endif; ?>


Получавам грешка:
Notice: Undefined property: stdClass::$social_tw in
Notice: Undefined property: stdClass::$social_fb in


Това ми е print_r((json_decode($data->channel->channel_settings)->social_link));

Array (
[0] => stdClass Object (
[social_fb] =>
[count] => 9
)
[1] => stdClass Object (
[social_tw] =>
[count] => 14 )
)
 
Последно редактирано:
Реших го така, въпреки че ако някой има по-добре решение съм ок за съвет.

PHP:
                <?php if((json_decode($data->channel->channel_settings)->social_link ?? null) && (json_decode($data->channel->channel_settings)->social_link != '')): ?>
                <h5>Връзки</h5>
                <p>
                    <?php if((json_decode($data->channel->channel_settings)->social_link[0])->social_fb != NULL): ?>
                        <a href="<?= (json_decode($data->channel->channel_settings)->social_link[0])->social_fb; ?>"><i class="fa fa-facebook" style="font-size:36px"></i></a>
                    <?php endif; ?>
                    <?php if((json_decode($data->channel->channel_settings)->social_link[1])->social_tw != NULL): ?>
                        <a href="<?= (json_decode($data->channel->channel_settings)->social_link[1])->social_tw; ?>"><i class="fa fa-twitter" style="font-size:36px"></i></a>
                    <?php endif; ?>
                </p>
                <?php endif; ?>
 
Защо викаш 15 пъти json_decode :D Изведи го някъде в контролера и го извикай веднъж преди да паснеш променливата към view-то.
 
Защо викаш 15 пъти json_decode :D Изведи го някъде в контролера и го извикай веднъж преди да паснеш променливата към view-то.
Може да не използва MVC, че да има контролер, но съм съгласен.
 
Като цяло и да не ползва MCV пак може да извика веднъж тази функция вместо всеки път като използва някоя променлива :)
 
Eто малък пример и от мен.


PHP:
<?php
$data = '{

    "status":"is_public",
    "avatar":"https://www.gravatar.com/avatar/64e1b8d34f425d19e1ee2ea7236d3028?s=80&d=identicon&r=g",
    "cover":"",
    "social_link":[
        {
            "social_fb":"https://facebook.com/link",
            "count":"9"
        },
        {
            "social_tw":"",
            "count":"14"
        }
    ]

}';
$jsonDecodedData = json_decode($data, true);
if(isset($jsonDecodedData['social_link']) && is_array($jsonDecodedData['social_link'])):
?>
<h5>Връзки</h5>
<p>
    <?php foreach ($jsonDecodedData['social_link'] as $rowKey => $rowSocialLink): ?>
        <?php foreach ($rowSocialLink ?? [] as $key => $row): ?>
            <?php
                if (strpos($key, '_') !== false):
                $social = explode('_', $key);
            ?>
                <a href="<?= $row; ?>">
                    <?php
                        switch($social[1] ?? '') {
                            case 'fb':
                                echo '<i class="fa fa-facebook-square" style="font-size:36px"></i>';
                                break;
                            case 'tw':
                                echo '<i class="fa fa-twitter-square" style="font-size:36px"></i>';
                                break;
                            default:
                                echo 'Image';
                        }
                    ?>
                </a>
            <?php endif; ?>
        <?php endforeach; ?>
    <?php endforeach; ?>
</p>
<?php endif; ?>
 
Леко бягам от темата, но на мен като цяло ми се струва странно, че имаш хетерогенен масив (освен ако не е забит с фиксирана дължина и изглежда винаги така):

JavaScript:
"social_link":[
    {
        "social_fb":"https://facebook.com/link", // <-- едно име тук
        "count":"9"
    },
    {
        "social_tw":"", // <-- друго име тук
        "count":"14"
    }
]

Ако искаш това да се разширява и допълва динамично, по-скоро би сложил "social_link" и "social_type" полета да речем (вместо social_fb / social_tw), които да са с еднакви имена във всеки елемент и да се различават само по стойност. Така ще можеш унифицирано да си напишеш view логиката (вместо да редиш if'ове един след друг в цикъла).

А ако се чудиш още защо не ти върви foreachът в началото, както очакваш, може да пуснеш var_dump на $RowSocialLink и да видим какво има в него.
 
Последно редактирано:
Леко бягам от темата, но на мен като цяло ми се струва странно, че имаш хетерогенен масив (освен ако не е забит с фиксирана дължина и изглежда винаги така):

JavaScript:
"social_link":[
    {
        "social_fb":"https://facebook.com/link", // <-- едно име тук
        "count":"9"
    },
    {
        "social_tw":"", // <-- друго име тук
        "count":"14"
    }
]

Ако искаш това да се разширява и допълва динамично, по-скоро би сложил "social_link" и "social_type" полета да речем (вместо social_fb / social_tw), които да са с еднакви имена във всеки елемент и да се различават само по стойност. Така ще можеш унифицирано да си напишеш view логиката (вместо да редиш if'ове един след друг в цикъла).

А ако се чудиш още защо не ти върви foreachът в началото, както очакваш, може да пуснеш var_dump на $RowSocialLink и да видим какво има в него.
Това е правилното решение. И на мен ми направи впечатление, че структурата не е правилна.
 
Чудесно, благодаря.

@deam0n след поста ми тук вече го бях коригирал, защото се усетих колко ще е безсмислено хаххаха относно: json_decode. Иначе да, MVC ползвам -> дори се чудя как да доразвия MVC-то и да го направя HMVC , тъй като искам да има опция за независими модули т.н.

А тосно типа social_type @anonimen => това го вземам за забележка, за да е по флекси за в бъдеще.

Благодаря пичове :)
 
Ти какво ползваш като работна рамка? HMVC е постижимо и с промяна на контролерите. Принципно съм работил с концепция от микросървиси по темата и не е лошо, но доста зависи от идеята и големината на проекта. Често не си заслужава времето, което ще се влага в преработка.
 

Back
Горе