如何通过关联对象值对PHP数组(RCP会员列表)排序
解决方案
要实现按会员姓氏(LastName)排序,你需要先把所有会员的相关数据收集到一个数组中,再用PHP的usort()函数根据姓氏字段排序,最后遍历排序后的数组生成表格。具体修改如下:
修改后的完整代码
// Get array of Active RCP members $memberships = rcp_get_memberships( array('status' => 'active') ); // 先收集所有会员的完整数据到数组 $membersData = []; foreach ($memberships as $membership) { $customer = $membership->get_customer(); $user_id = $customer->get_user_id(); $user_info = get_userdata($user_id); // 把需要的字段都存入数组 $membersData[] = [ 'first_name' => $user_info->first_name, 'last_name' => $user_info->last_name, 'school' => get_user_meta( $user_id, 'rcp_school', true ), 'role' => get_user_meta( $user_id, 'rcp_role', true ), 'gender' => get_user_meta( $user_id, 'rcp_gender', true ), 'email' => $user_info->user_email, 'phone' => get_user_meta( $user_id, 'rcp_phone', true ) ]; } // 按姓氏(last_name)升序排序(如果要降序,把$a和$b调换位置) usort($membersData, function($a, $b) { return strcmp($a['last_name'], $b['last_name']); }); // 生成表格内容(补充原代码缺失的表格起始标签) $message = '<table>'; foreach ($membersData as $member) { $message .= '<tr> <td class="directory-cell">' . $member['last_name'] . ', ' . $member['first_name'] . '</td> <td class="directory-cell">' . $member['school'] . '</td> <td class="directory-cell">' . $member['role'] . '</td> <td class="directory-cell">' . $member['gender'] . '</td> <td class="directory-cell">' . $member['email'] . '</td> <td class="directory-cell">' . $member['phone'] . '</td> </tr>'; } // Close table after all active members are looped through $message .= '</table>'; // Return output for shortcode return $message;
关键说明
- 数据收集:先把每个会员的姓名、元数据等信息统一存入
$membersData数组,这样后续排序时能直接访问到last_name字段。 - 排序逻辑:
usort()是PHP的自定义排序函数,这里用匿名函数对比两个会员的last_name,strcmp()函数会按字符串自然顺序比较,返回排序所需的差值。如果需要降序排列,只需把strcmp($a['last_name'], $b['last_name'])改成strcmp($b['last_name'], $a['last_name'])即可。 - 表格生成:遍历排序后的
$membersData数组,直接取出字段拼接HTML,逻辑更清晰。
另外补充了原代码缺失的<table>起始标签,确保HTML结构完整。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

