Поиск многомерного массива PHP по значению с использованием другого значения

#php #arrays #multidimensional-array

Вопрос:

Мне нужно получить отдельный «идентификатор» и соответствующее ему «имя», как я могу сделать это в многомерном массиве?

 $userdb = array(
array(
    'uid' => '100',
    'name' => 'Sandra Shush',
    'pic_square' => 'urlof100'
),
array(
    'uid' => '5465',
    'name' => 'Stefanie Mcmohn',
    'pic_square' => 'urlof100'
),
array(
    'uid' => '5465',
    'name' => 'Jane Doe',
    'pic_square' => 'urlof100'
),
array(
    'uid' => '40489',
    'name' => 'Michael',
    'pic_square' => 'urlof40489'
), 
array(
    'uid' => '40489',
    'name' => 'Jane Doe',
    'pic_square' => 'urlof40489'
));
 

пример вывода:

 $data = [{uid: '100', name: 'Sandra Shush'},{uid: '5465', name: ['Stefanie Mcmohn','Jane Doe']}, {uid: '40489', name: ['Michael','Jane Doe']}]
 

пробовал работать с array_columns и array_keys, но я не могу придумать правильный способ получить это.

Ответ №1:

Попробуйте что-нибудь подобное , вот я сохраняю uid в массив и проверяю, доступен ли он уже в массиве с функцией in_array

 <?php
$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    ),
    array(
        'uid' => '40489',
        'name' => 'Jane Doe',
        'pic_square' => 'urlof40489'
        ));
$newUserDb = array();

$arrayUserId=array();
foreach ($userdb as $user) {
  $newUserDbSingle=array();
  $nameArray=array();
    if (in_array($user['uid'], $arrayUserId))
    {
      $key = array_search ($user['uid'], $arrayUserId);
      $nameArray=$newUserDb[$key]['name'];
      array_push($newUserDb[$key]['name'], $user['name']);
      
    }
    else
    {
      unset($user['pic_square']);
      $arrayUserId[]=$user['uid'];
      $newUserDbSingle=$user;
      $newUserDbSingle['name']=array($user['name']);
      $newUserDb[]=$newUserDbSingle;
    }
}
print_r($newUserDb);
?>
 

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

1. спасибо, это работает. но как я могу ограничить $newUserDb только uid и именем? в вашем решении «pic_square» по-прежнему включен в массив $newUserDb

2. @caia обновил мой ответ

Ответ №2:

Попробуйте это решение:

 $data = [];

foreach($userdb as $user)
{
    if(array_key_exists($user['uid'], $data))
    {
        array_push($obj->name, $user['name']);
    }
    else
    {
        $obj = new stdClass;

        $obj->uid = $user['uid'];
        $obj->name = [];
        
        array_push($obj->name, $user['name']);
        $data[$user['uid']] = $obj;
    }
}

print_r($data);
 

Ответ №3:

У меня есть эта функция, которая очень близка к тому, что вам нужно, просто измените возврат в соответствии с вашим запросом. Удачи

 function array_searchRecursive($needle, $haystack, $strict = false, $path = array()) {
    if (!is_array($haystack)) {
        return false;
    }
    foreach ($haystack as $key => $val) {
        if (is_array($val) amp;amp; $subPath = array_searchRecursive($needle, $val, $strict, $path)) {
            $path = array_merge($path, array($key), $subPath);
            return $path;
        } elseif ((!$strict amp;amp; $val == $needle) || ($strict amp;amp; $val === $needle)) {
            $path[] = $key;
            return $path;
        }
    }
    return false;
}
 

Ответ №4:

Вы можете попробовать следующий подход:

 $userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    ),
    array(
        'uid' => '40489',
        'name' => 'Jane Doe',
        'pic_square' => 'urlof40489'
        ));
$nameArray = [];
$myUuid = '40489';
foreach ($userdb as $user) {
    if ($myUuid == $user['uid']) {
        array_push($nameArray, $user['name']);
    }
}
print_r($nameArray);
 

и более того, из этого цикла вы можете получить любой параметр или все, что вам нужно, из приведенного выше массива foreach .

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

1. Привет, @PHPGeek, я изменил свой образец вывода. приношу извинения за путаницу. Ты все еще можешь мне в этом помочь?

2. я имею в виду группировку по идентификатору с именем в одном массиве. верно?

3. да, это так.