#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. да, это так.