How would combine multiple exploded lists created by foreach into one array?

Issue

Let’s say hypothetically I have this information listed on each users profile:

UserA (list) = dog, cat, sheep, bird, duck

UserB (list) = zebra, lion, cheetah, leopard

UserC (list) = alligator, lizard, frog, turtle

and I have this function:

    foreach($users as $user){
       $user_list = $user->list;
       $user_list_array = explode(', ', $user_list);
          foreach($user_list_array as $user_list_item){

          }
       }
    }

This is where I’m stumped… How do I combine all the lists into one big comma separated list and explode that full list into one array that I can then use?


EDIT: Here are the exact sample lists I’m testing with and the results I’m getting with the following code:

THE LISTS:

ListA: Singing, Rapping, Dancing, Comical Skits, Cooking, Cleaning, Shoe-Tying, Hop on No Legs

ListB: Wine Tasting, Hospitality, Business Management, Financial Planning, Business Marketing, Professional Driving

THE CODE:

<?php
$roles = array('employee', 'administrator');
/* Loop through users to search for the admin and employee users. */
foreach( $roles as $role ) {
   $this_role = "'[[:<:]]".$role."[[:>:]]'";
   $query = "SELECT * FROM $wpdb->users WHERE ID = ANY (SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'wp_capabilities' AND meta_value RLIKE $this_role) ORDER BY user_nicename ASC LIMIT 10000";
   $users = $wpdb->get_results($query);
        if ($users){
        $output = array();
        foreach($users as $user){
                $curuser = get_userdata($user->ID);
                $user_list = $curuser->skills;
                $user_list_array = explode(', ', $user_list);
                foreach($user_list_array as $user_list_item){
                    $output[] = $user_list_item;
                }
            }   
            echo implode(', ', $output);
        }
    }?>

THE RESULT:

Singing, Rapping, Dancing, Comical Skits, Cooking, Cleaning, Shoe-Tying, Hop on No Legs, , , , , , Wine Tasting, Hospitality, Business Management, Financial Planning, Business Marketing, Professional Driving

Solution

How do I combine all the lists into one big comma separated list and explode that full list into one array that I can then use?

That’s a long winded process of doing this:

$output = array();
foreach($users as $user){
   $user_list = $user->list;
   $user_list_array = explode(', ', $user_list);
   foreach($user_list_array as $user_list_item){
       $output[] = $user_list_item;
   }
}
echo implode(', ', $output); // your combined results

But why not simplify it and just concatenate the results you want for each array?

$output = '';
foreach($users as $user) {
    $output .= $user->list;
}
// this doesn't use arrays at all
echo $output;

… or better yet (as far as structured data goes), merge the arrays:

$output = array();
foreach($users as $user) {
    $bits = explode(', ', $user->list);
    $output = array_merge($output, $bits);
}

// this is a simplified step from your first example
echo implode(', ', $output);

Edit

Updating based on your output with lots of this: ,,,,,, – chances are you have blank fields in your database. You’re still adding those to the array and they’re still being comma seperated. I’d suggest this:

foreach($user_list_array as $user_list_item){
    if(trim($user_list_item) != '')
        $output[] = $user_list_item;
    // only add the item if it's not blank (after trimming potential whitespace off)
}

Edit : Is there any way to input a comma where the first list stops and next list starts?

Of course, either add it after the inner foreach loop using the [] structure to add a new array item like this:

$output[] = PHP_EOL; // or \n newline, or a space, or whatever you want to seperate your sets as well as a comma

… or the better way (structurally) would be to create a multi dimensional array and implode it at the end;

$output = array();
foreach($users as $user){
    $temp_output = array();
    $curuser = get_userdata($user->ID);
    $user_list = $curuser->skills;
    $user_list_array = explode(', ', $user_list);
    foreach($user_list_array as $user_list_item){
        if(trim($user_list_item) != '')
            $temp_output[] = $user_list_item;
    }
    $output[] = implode(', ', $temp_output);
}
// put your set delimiter here, whether it's a comma, |, \n, PHP_EOL, whatever
echo implode(', ', $output);

Answered By – scrowler

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published