T
T
topuserman2021-08-08 12:01:59
PHP
topuserman, 2021-08-08 12:01:59

How to output tags based on php array (using only 1 loop)?

Given an array like this:

$arData = [

];

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Mikhail Ushenin, 2021-08-08
@usheninmike

This is how it seems to work:

$html = array_reduce(array_keys($arData), function($data, $i) use ($arData) {
    $item = $arData[$i];
    $is_last_item = $i == count($arData) - 1;

    if ($i == 0) {
        $data['result_html'] = '<div class="items-container">';

        if ($item['group']) {
            $data['group_html'] = '<div class="group" data-group="' . $item['group'] . '">'
                . '<div class="item">' . $item['title'] . '</div>';
        } else {
            $data['result_html'] .= '<div class="item">' . $item['title'] . '</div>';
        }
    } else {
        if ($item['group']) {
            $previous_item = $arData[$i - 1];

            if ($previous_item['group']) {
                if ($previous_item['group'] == $item['group']) {
                    $data['group_html'] .= '<div class="item">' . $item['title'] . '</div>';
                } else {
                    $data['result_html'] .= $data['group_html'] . '</div>';
                    $data['group_html'] = '<div class="group" data-group="' . $item['group'] . '">'
                        . '<div class="item">' . $item['title'] . '</div>';
                }
            } else {
                $data['group_html'] = '<div class="group" data-group="' . $item['group'] . '">'
                    . '<div class="item">' . $item['title'] . '</div>';
            }

            if ($is_last_item) {
                $data['result_html'] .= $data['group_html'] . '</div>' ;
            }
        } else {
            if (strlen($data['group_html'])) {
                $data['result_html'] .= $data['group_html'] . '</div>';
                $data['group_html'] = '';
            }

            $data['result_html'] .= '<div class="item">' . $item['title'] . '</div>';
        }
    }

    if ($is_last_item) {
        $data['result_html'] .= '</div>' ;
        return $data['result_html'];
    } else {
        return $data;
    }
}, [
    'result_html' => '',
    'group_html' => '',
]);

Only you have an error in the expected result: it should be instead
<div class="group" data-group="3">
<div class="group" data-group="4">

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question