如何将foreach创建的多个分解列表组合成一个数组


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

假设我在每个用户配置文件中都列出了以下信息:

UserA(列表)=狗、猫、羊、鸟、鸭

用户B(列表)=斑马、狮子、猎豹、豹

UserC(列表)=鳄鱼、蜥蜴、青蛙、乌龟

我有这个功能:

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

这就是我被难住的地方。。。如何将所有列表组合成一个逗号分隔的大列表,并将整个列表分解成一个数组,然后使用?


编辑:以下是我正在测试的确切样本列表,以及我使用以下代码得到的结果:

列表:

ListA:唱歌、说唱、跳舞、滑稽滑雪、烹饪、清洁、系鞋带、无腿跳

ListB:品酒、酒店、商业管理、财务规划、商业营销、专业驾驶

代码:

<?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);
        }
    }?>

结果:

唱歌,说唱,跳舞,滑稽滑雪,烹饪,清洁,系鞋带,无腿跳,,,品酒,酒店,商业管理,财务规划,商业营销,专业驾驶

如何将所有列表组合成一个逗号分隔的大列表,并将整个列表分解成一个数组,然后使用?

这是一个冗长的过程:

$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

但是,为什么不简化它,只连接每个数组所需的结果呢?

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

或者更好的是(就结构化数据而言),合并数组:

$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);

编辑

根据您的输出进行更新:,,,,,,——很可能您的数据库中有空白字段。您仍在将它们添加到数组中,并且它们仍以逗号分隔。我建议这样做:

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)
}

编辑:有没有办法在第一个列表停止和下一个列表开始的地方输入逗号?

当然,使用[]结构将其添加到内部foreach循环之后,以添加一个新的数组项,如下所示:

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

或者(在结构上)更好的方法是创建一个多维阵列,并在最后将其内爆;

$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);
$bigArray = array();
foreach($users as $user){
    $user_list = $user->list;
    $user_list_array = explode(', ', $user_list);
    foreach($user_list_array as $user_list_item){
        $bigArray[] = $user_list_item;
    }
}
$all_user_list_array = array();
foreach($users as $user){
   $user_list = $user->list;
   $user_list_array = explode(', ', $user_list);
   $all_user_list_array = array_merge($all_user_list_array, $user_list_array); 
}
$all_user_list = implode(', ', $all_user_list_array);

我基本上是创建一个由所有列表项组成的大数组,然后将其打包为一个数组,用逗号分隔每个值。

也许值得一问的是,你到底在努力实现什么?有比逗号分隔字符串更好的存储数据的方法。这些字符串可能需要一段时间才能处理,因为它们需要标记化。但是,我很感激您可能有自己的用例。

这将为您提供一个具有唯一值的完整列表(多个列表中没有重复值)。我假设使用UserA(list),您有一个带有用户对象的用户数组。

$complete_list = array();
foreach( $users as $user )
{
    $list = explode( ",", $user->list );
    foreach( $list as $k=>$item ) $list[$k] = trim( $item );
    $complete_list = array_merge( $complete_list, $list );
}

如果你的用户阵列是一个阵列,这就是解决方案:

$complete_list = array();
foreach( $users as $user )
{
    $list = explode( ",", $user['list'] );
    foreach( $list as $k=>$item ) $list[$k] = trim( $item );
    $complete_list = array_merge( $complete_list, $list );
}