假设我在每个用户配置文件中都列出了以下信息:
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 );
}