Что привлекает мое внимание, так это то, что следующий код «переопределит» каждое состояние выставления счета последним найденным пользователем:
$usersByState = array();
foreach ($users as $user) {
$usersByState[get_user_meta($user->ID, 'billing_state', true)] = $user;
}
Из того, что я понял, лучше пойти на:
$usersByState = array();
foreach ($users as $user) {
$billing_state = get_user_meta($user->ID, 'billing_state', true);
if ($billing_state)
$usersByState[$billing_state][] = $user;
}
Таким образом, делая это, вы собираете несколько пользователей для разных состояний. Более того, это должно заботиться о пустых «состояниях», как вы описали. Не уверен, что это полностью решит вашу проблему, но это может стать отправной точкой для уточнения вашей функции.