Как создать новые массивы из массива объектов на основе user_id? - PullRequest
0 голосов
/ 09 июля 2019

У меня проблемы с циклическим просмотром массива объектов и отображением данных из него при определенных условиях.

Я хочу, чтобы на веб-странице отображалось следующее:

<p>John Doe</p> <p>William Green</p> <p>Jane Smith</p>

Я знаю, как это сделать, определив $ user [0] -> first_name. $ user [0] -> last_name, в частности, но мне нужен способ, чтобы код циклически проходил и отображал имена динамически, используя свойство user_id в качестве уникального идентификатора.

Для всех объектов в массиве с user_id 1 вернуть «эти значения». Для всех объектов в массиве с user_id 2 верните «эти значения». И так далее ... циклически просматривая каждый уникальный user_id.

Вот var_dump массива объектов:

array(4)
{   [0]=> object(stdClass)#4336 (4)
        {
        ["umeta_id"]=> string(1) "1"
        ["user_id"]=> string(1) "1"
        ["meta_key"]=> string(10) "first_name"
        ["meta_value"]=> string(4) "John" 
        }
    [1]=> object(stdClass)#4333 (4)
        {
        ["umeta_id"]=> string(1) "2"
        ["user_id"]=> string(1) "1"
        ["meta_key"]=> string(9) "last_name"
        ["meta_value"]=> string(3) "Doe"
        }
    [2]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "3"
        ["user_id"]=> string(1) "2"
        ["meta_key"]=> string(10) "first_name"
        ["meta_value"]=> string(4) "Jane"
        }
    [3]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "4"
        ["user_id"]=> string(1) "2"
        ["meta_key"]=> string(9) "last_name"
        ["meta_value"]=> string(5) "Smith"
        }
    [4]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "5"
        ["user_id"]=> string(1) "3"
        ["meta_key"]=> string(10) "first_name"
        ["meta_value"]=> string(7) "William"
        }
    [5]=> object(stdClass)#4334 (4)
        {
        ["umeta_id"]=> string(1) "6"
        ["user_id"]=> string(1) "3"
        ["meta_key"]=> string(9) "last_name"
        ["meta_value"]=> string(5) "Green"
        }
}

Когда я выводю информацию на веб-страницу, я хочу, чтобы она выглядела следующим образом:

<p>John Doe</p> <p>William Green</p> <p>Jane Smith</p>

Может быть, мне нужно перебрать объекты и создать новые массивы на основе user_ids? Пожалуйста, не предоставляйте код с echo или print_r. Для этого проекта можно использовать только «возврат».

Ответы [ 2 ]

1 голос
/ 09 июля 2019

То есть $your_object уже отсортировано по полям umeta_id и user_id?

Если нет, вы можете использовать usort :

function cmp1($a, $b)
{
    return strcmp($a->umeta_id, $b->umeta_id);
}
function cmp2($a, $b)
{
    return strcmp($a->user_id, $b->user_id);
}

usort($your_object, "cmp1");
usort($your_object, "cmp2");

Тогдапросто:

$str = '';
for($i=0;$i<count($your_object);$i+=2){
  $str .= "<p>".$your_object[$i]->meta_value." "$your_object[$i+1]->meta_value."</p> ";
}
return $str; // this var contain all your data in string

Надеюсь, это поможет!

0 голосов
/ 09 июля 2019

Это сгенерирует пары имени и фамилии:

$user_group = array();

ksort($user_group, SORT_NUMERIC);

foreach ($users as $key => $item) {
    $name_meta = get_object_vars($item);
    foreach ($name_meta as $meta_in => $names) {
        if ($names == 'first_name') {
            $user_group[$item->user_id]['first_name'] = $name_meta['meta_value'];
        }
        if ($names == 'last_name') {
            $user_group[$item->user_id]['last_name'] = $name_meta['meta_value'];
        }
    }
}

Выход:

array(3) {
[1]=>
array(2) {
    ["first_name"]=>
    string(4) "John"
    ["last_name"]=>
    string(3) "Doe"
}
[2]=>
array(2) {
    ["first_name"]=>
    string(4) "Jane"
    ["last_name"]=>
    string(5) "Smith"
}
[3]=>
array(2) {
    ["first_name"]=>
    string(7) "William"
    ["last_name"]=>
    string(5) "Green"
}
}

И для печати пар имени пользователя:

foreach ($user_group as $name) {
    echo "<p>" . $name['first_name'] . " " . $name['last_name'] . "</p>";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...