【问题标题】:How would combine multiple exploded lists created by foreach into one array?如何将由 foreach 创建的多个爆炸列表合并到一个数组中?
【发布时间】:2013-12-14 21:38:17
【问题描述】:

假设我在每个用户的个人资料中都列出了这些信息:

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

UserB (list) = 斑马、狮子、猎豹、豹子

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

我有这个功能:

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

结果:

唱歌、说唱、跳舞、滑稽短剧、烹饪、清洁、系鞋带、无腿跳、、、、、、、品酒、款待、商业管理、财务规划、商业营销、专业驾驶

【问题讨论】:

  • 这是一个伪算法还是您在询问特定语言?预期的结果是什么? “explode”是库函数吗?
  • 抱歉含糊不清。这只是我在 Wordpress 中尝试做的一个通用示例,它在 SQL 中查询每个用户的“列表”元值。我想将所有用户的列表组合成一个我可以使用的单个“标签”的大数组。

标签: php arrays foreach explode comma


【解决方案1】:

如何将所有列表组合成一个逗号分隔的大列表,然后将该完整列表分解为一个我可以使用的数组?

这是一个漫长的过程:

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

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

当然,也可以在 inner 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);

【讨论】:

  • 我已经编辑了我的问题,所以你可以看到发生了什么......我遇到了这个奇怪的情况,逗号都插入在两个列表之间。
  • 那行得通!..但有一件事。有没有办法在第一个列表停止和下一个列表开始的地方输入逗号?
  • 完美!问题解决了!非常感谢您的时间/帮助。现在进入我项目的下一阶段。你就是那个人@scrowler!
  • @Kubashi - 别担心 - 接受 :) 你也会因此获得奖牌
  • 接受!抱歉,我刚刚掌握了这个工具的窍门。再次感谢!
【解决方案2】:
$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;
    }
}

【讨论】:

    【解决方案3】:
    $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);
    

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

    也许值得一问到底你想达到什么目标?存储数据的方法比逗号分隔的字符串更好。这些字符串可能需要一段时间来处理,因为它们需要被标记化。但是,我很欣赏您可能有自己的用例。

    【讨论】:

    • 它是逗号分隔的,因为它来自一个询问用户技能的表单。它要求他们输入以逗号分隔的每个技能。
    • 这很公平,但这并不意味着您需要这样存储它。将提交的值拆分为数组并将它们分配给用户可能会更好。在这种情况下,它将在以后帮助您。例如,如果用户想要编辑列表并删除一个项目。如果将值存储在数组中,则添加该功能会变得更加简单。
    • 对不起,我从未使用过重力形式。如果您发布一些示例代码,如果您有任何问题,我可以尝试帮助您。
    • 谢谢...我看看能不能开始。
    【解决方案4】:

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

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

    【讨论】:

    • @Kubashi - trim 删除字符串左右两端的空格
    • array_merge 为您提供唯一值... trim 只是删除空格。现在看...这不会像我的方式那样工作...我会修复它。
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 2015-06-05
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多