Пересечение одинарных многомерных массивов в PHP

#php #multidimensional-array #intersection #array-intersect

#php #многомерный-массив #пересечение #array-пересекать

Вопрос:

У меня есть следующий массив :

 $output = array(
  1507073550 => array(
    0 => array(
        "userid" => "1507073550"
        "username" => "ma_alikhani"
        "type" => "comment"
        "profile_image" => "https://instagram.fgbb2-1.fna.fbcdn.net/v/t51.2885-19/s150x150/75538099_557824008392923_8054831368279949312_n.jpg?_nc_ht=instagram.fgbb2-1.fna.fbcdn.netamp;_nc_ohc"
    )
    1 => array(
        "userid" => "11863258101"
        "username" => "rasouli680"
        "type" => "comment"
        "profile_image" => "https://instagram.fgbb2-1.fna.fbcdn.net/v/t51.2885-19/s150x150/70326284_949495768737898_5241573836020776960_n.jpg?_nc_ht=instagram.fgbb2-1.fna.fbcdn.netamp;_nc_ohc"
    )
    2 => array(
        "userid" => "16528062"
        "username" => "alireza"
        "type" => "comment"
        "profile_image" => "https://instagram.fgbb2-1.fna.fbcdn.net/v/t51.2885-19/s150x150/70597112_740563976416368_5253996423334068224_n.jpg?_nc_ht=instagram.fgbb2-1.fna.fbcdn.netamp;_nc_ohc"
    )
  )
  16528062 => array(
    0 => array(
        "userid" => "16528062"
        "username" => "alireza"
        "type" => "comment"
        "profile_image" => "https://instagram.fgbb2-1.fna.fbcdn.net/v/t51.2885-19/s150x150/70597112_740563976416368_5253996423334068224_n.jpg?_nc_ht=instagram.fgbb2-1.fna.fbcdn.netamp;_nc_ohc"
    )
    1 => array(
        "userid" => "1507073550"
        "username" => "ma_alikhani"
        "type" => "comment"
        "profile_image" => "https://instagram.fgbb2-1.fna.fbcdn.net/v/t51.2885-19/s150x150/75538099_557824008392923_8054831368279949312_n.jpg?_nc_ht=instagram.fgbb2-1.fna.fbcdn.netamp;_nc_ohc"
    )
  )
)
 

и я хочу пересечь ключи этого массива. получаем первый ключ «1507073550» и второй ключ «16528062» и пересекаем все их данные.
у него не всегда есть 2 ключа, у него может быть 2 ключа, я написал этот код, но я получаю ошибку преобразования массива в строку.

             $keys = array_keys($output);
            foreach ($keys as $index => $values)
            {
                $current_value = $output[$values]; // or $current_value = $a[$keys[$index]];
                $next_key = next($keys);
                $next_value = $output[$next_key] ?? null; // for php version >= 7.0
                $a[] = array_intersect_assoc($current_value,$next_value);
            }

 

и я ожидаю этого результата :

 array(
    0 => array(
        "userid" => "1507073550"
        "username" => "ma_alikhani"
        "type" => "comment"
        "profile_image" => "https://instagram.fgbb2-1.fna.fbcdn.net/v/t51.2885-19/s150x150/75538099_557824008392923_8054831368279949312_n.jpg?_nc_ht=instagram.fgbb2-1.fna.fbcdn.netamp;_nc_ohc"
    )
    1 => array(
        "userid" => "16528062"
        "username" => "alireza"
        "type" => "comment"
        "profile_image" => "https://instagram.fgbb2-1.fna.fbcdn.net/v/t51.2885-19/s150x150/70597112_740563976416368_5253996423334068224_n.jpg?_nc_ht=instagram.fgbb2-1.fna.fbcdn.netamp;_nc_ohc"
    )
)
 

Я действительно не знаю, как это сделать!
Буду признателен за вашу помощь.

Комментарии:

1. Не похоже, что вы хотите начать с фактического пересечения? Похоже, вы хотели взять первый элемент из каждого подэлемента, где userid значение соответствует ключу массива верхнего уровня?

2. Не ключ массива верхнего уровня, я хочу пересекать подмассивы ключа массива верхнего уровня, как вы можете видеть, есть 2 массива, которые доступны в обоих ключах массива верхнего уровня.

Ответ №1:

 function intersect(array $src, array $keys)
{
    // Require that both $src and $keys have data
    if (!$src || !$keys) {
        return [];
    }

    // Hold the users for each key in $keys
    $sets = [];

    // Store the users from $src to $sets as dictated by $keys
    foreach ($keys as $key) {
        if (isset($src[$key])) {
            // Re-key the list of users with their user id
            $userIds = array_column($src[$key], 'userid');
            $sets[$key] = array_combine($userIds, $src[$key]);
        }
    }

    if (count($sets) !== count($keys)) {
        // Up to you if you want to require that all keys must be valid/present in the $src
    }

    // Get the users present in all of the set dictated by $keys
    $users = call_user_func_array('array_intersect_key', $sets);

    return $users;
};
 

Для использования:

 $output = [ ... ];  // $ouput in the question
$keys = [1507073550, 16528062];  // see question
$users = intersect($output, $keys);