Jump to content

Arrange the results of a foreach in a table


Sagaroth

Recommended Posts

Hello everyone !

I am currently developing a module for my site that will allow me to classify each solution to help a disability by type.
For example, here's an example:

Type : Visual disability
Solution : Add screen readers

For this, I have a database in which these types and solutions are found. In this database, the solutions of one type or another are not in a defined order. They can be put randomly, when a user adds one.

I need to display, in a table, these Types first (as a title), then the solutions corresponding to this type.

I manage to generate a display thanks to a foreach loop, but my solutions are all mixed up and therefore not clearly sorted.


This is how it is currently displayed

Visual disability

    Audio-described cut-scenes

    Highlighted path to follow

    Sensitivity settings for all the controls

    Screen readers on menus

    Slow down the game speed

But I would need it to look like this:

Visual disability

    Audio-described cut-scenes

    Highlighted path to follow

    Screen readers on menus

    Slow down the game speed

Physical disability

    Sensitivity settings for all the controls

In my example above, only the solution "Sensitivity settings for all the controls" is part of the "Physical disability" type. The rest is part of the "Visual disability" type.

Here is the code I currently use to retrieve my information from my database and display it. It's a Wordpress.

 

/*====== Accessibility Options ======*/

function cloux_accessibility_options() {
    if ( function_exists( 'rwmb_meta' ) ) {
        $output = "";
        $accessibility_options = rwmb_meta( 'accessibility-options' );
        $accessibility_options_status = rwmb_meta( 'accessibility-options-status' );
        if( $accessibility_options_status == "1" ) {
            if( !empty( $accessibility_options ) ) {
                $output .= '<div class="accessibility-options widget-box">';
                    $output .= cloux_title( $title = esc_html__( 'Accessibility Options', 'cloux' ), $style = "style-4", $align = "left", $colored_title = '' );
                    $output .= '<ul>';
                        $output .= '<li class="title visual_disability">' . esc_html__( 'Visual disability', 'cloux' ) . '</li>';
                    $output .= '</ul>';

                        foreach ( $accessibility_options as $accessibility_options ) {
                            if( !empty( $accessibility_options ) ) {
                                $accessibility_name =  isset( $accessibility_options['accessibility-options-name'] ) ? $accessibility_options['accessibility-options-name'] : '';
                                $accessibility_type =  isset( $accessibility_options['accessibility-type-name'] ) ? $accessibility_options['accessibility-type-name'] : '';
                                $accessibility_type = get_term( $accessibility_type, 'accessibility' );
                                $accessibility_type_name = $accessibility_type->name;
                                $availability =  isset( $accessibility_options['availability'] ) ? $accessibility_options['availability'] : '';

                            if ( $accessibility_type_name == "Visual disability" ){
                                if( !empty( $accessibility_name ) or !empty( $availability )) {
                        $output .= '<ul>';
                                    $output .= '<li class="item accessibility_name">';
                                        if( !empty( $accessibility_name ) ) {
                                            $accessibility_name = get_term( $accessibility_name, 'accessibility' );
                                            if( ( !empty( $accessibility_name ) ) ) {
                                                $output .= '<a href="' . get_term_link( $accessibility_name ) . '">' . esc_attr( $accessibility_name->name ) . '</a>';
                                            }
                                        }
                                    $output .= '</li>';
                                    $output .= '<li class="item visual_disability status">';
                                        if( $availability == "1" ) {
                                            $output .= '<i class="fas fa-check" aria-hidden="true"></i>';
                                        } else {
                                            $output .= '<i class="fas fa-times" aria-hidden="true"></i>';
                                        }
                                    $output .= '</li>';
                                }
                            }
                            
                            
                            if ( $accessibility_type_name == "Motor/Physical disability" ){
                                if( !empty( $accessibility_name ) or !empty( $availability )) {
                        $output .= '<ul>';
                                    $output .= '<li class="item accessibility_name">';
                                        if( !empty( $accessibility_name ) ) {
                                            $accessibility_name = get_term( $accessibility_name, 'accessibility' );
                                            if( ( !empty( $accessibility_name ) ) ) {
                                                $output .= '<a href="' . get_term_link( $accessibility_name ) . '">' . esc_attr( $accessibility_name->name ) . '</a>';
                                            }
                                        }
                                    $output .= '</li>';
                                    $output .= '<li class="item visual_disability status">';
                                        if( $availability == "1" ) {
                                            $output .= '<i class="fas fa-check" aria-hidden="true"></i>';
                                        } else {
                                            $output .= '<i class="fas fa-times" aria-hidden="true"></i>';
                                        }
                                    $output .= '</li>';
                                }
                            }
                            
                            
                        $output .= '</ul>';
                        }
                    }
                $output .= '</div>';
            }
        }
        return $output;
    }
}

Thank you in advance for all the help you can give me!

 

Edited by Sagaroth
Link to comment
Share on other sites

Sort the array first.

Assuming you start with ...

$options = [
               [ 'type' => 'Visual disability',   'name' => 'Audio-described cut-scenes' ],
               [ 'type' => 'Visual disability',   'name' => 'Highlighted path to follow' ],
               [ 'type' => 'Physical disability', 'name' => 'Sensitivity settings for all the controls' ],
               [ 'type' => 'Visual disability',   'name' => 'Screen readers on menus' ],
               [ 'type' => 'Visual disability',   'name' => 'Slow down the game speed' ],
           ];

then ...

#
#  Sort the array by type (descending)
#
usort($options, function($a, $b) { return $b['type'] <=> $a['type']; });
#
#  process the array
#    
$prev_type = '';                                                                // store previous type
echo "<ul>\n";
foreach ($options as $opt) {
    if ($opt['type'] != $prev_type) {                                           // is this a new type?
        if ($prev_type != '') {                                                 // was there a previous one?
            echo "</ul>\n</li>\n";                                              // if so, close it
        }
        echo "<li>{$opt['type']}\n<ul>\n";
        $prev_type = $opt['type'];                                              // store as previous value
    }
    echo "<li>{$opt['name']}</li>\n";
}
// close last group
echo "</ul>\n</li>\n";    
// close whole list
echo "</ul>\n";
    

giving ...

<ul>
    <li>Visual disability
        <ul>
            <li>Audio-described cut-scenes</li>
            <li>Highlighted path to follow</li>
            <li>Screen readers on menus</li>
            <li>Slow down the game speed</li>
        </ul>
    </li>
    <li>Physical disability
        <ul>
            <li>Sensitivity settings for all the controls</li>
        </ul>
    </li>
</ul>

An alternative approach is to reorganise the array using subarrays for each type...

$options = [
               'Visual disability' => [ 'Audio-described cut-scenes',
                                        'Highlighted path to follow',
                                        'Screen readers on menus',
                                        'Slow down the game speed'
                                      ],
                                      
               'Physical disability' => [ 'Sensitivity settings for all the controls' 
                                        ]
           ];

then use two nested foreach() loops.

  • Like 2
Link to comment
Share on other sites

16 hours ago, Barand said:

Sort the array first.

Assuming you start with ...


$options = [
               [ 'type' => 'Visual disability',   'name' => 'Audio-described cut-scenes' ],
               [ 'type' => 'Visual disability',   'name' => 'Highlighted path to follow' ],
               [ 'type' => 'Physical disability', 'name' => 'Sensitivity settings for all the controls' ],
               [ 'type' => 'Visual disability',   'name' => 'Screen readers on menus' ],
               [ 'type' => 'Visual disability',   'name' => 'Slow down the game speed' ],
           ];

then ...


#
#  Sort the array by type (descending)
#
usort($options, function($a, $b) { return $b['type'] <=> $a['type']; });
#
#  process the array
#    
$prev_type = '';                                                                // store previous type
echo "<ul>\n";
foreach ($options as $opt) {
    if ($opt['type'] != $prev_type) {                                           // is this a new type?
        if ($prev_type != '') {                                                 // was there a previous one?
            echo "</ul>\n</li>\n";                                              // if so, close it
        }
        echo "<li>{$opt['type']}\n<ul>\n";
        $prev_type = $opt['type'];                                              // store as previous value
    }
    echo "<li>{$opt['name']}</li>\n";
}
// close last group
echo "</ul>\n</li>\n";    
// close whole list
echo "</ul>\n";
    

giving ...


<ul>
    <li>Visual disability
        <ul>
            <li>Audio-described cut-scenes</li>
            <li>Highlighted path to follow</li>
            <li>Screen readers on menus</li>
            <li>Slow down the game speed</li>
        </ul>
    </li>
    <li>Physical disability
        <ul>
            <li>Sensitivity settings for all the controls</li>
        </ul>
    </li>
</ul>

An alternative approach is to reorganise the array using subarrays for each type...


$options = [
               'Visual disability' => [ 'Audio-described cut-scenes',
                                        'Highlighted path to follow',
                                        'Screen readers on menus',
                                        'Slow down the game speed'
                                      ],
                                      
               'Physical disability' => [ 'Sensitivity settings for all the controls' 
                                        ]
           ];

then use two nested foreach() loops.

Thanks Barand!

 

I hadn't seen this solution with an array, it's well thought out!

I will try to integrate it into my code.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.