Массив объединяет три или более массива с php
ok, предполагая, что у меня есть 5 массивов, все только индексированные массивы, и я хотел бы их комбинировать, это лучший способ, который я могу понять, есть ли лучший способ справиться с этим?
function mymap_arrays(){
$args=func_get_args();
$key=array_shift($args);
return array_combine($key,$args);
}
$keys=array('u1','u2','u3');
$names=array('Bob','Fred','Joe');
$emails=array('[email protected]','[email protected]','[email protected]');
$ids=array(1,2,3);
$u_keys=array_fill(0,count($names),array('name','email','id'));
$users=array_combine($keys,array_map('mymap_arrays',$u_keys,$names,$emails,$ids));
это возвращает:
Array
(
[u1] => Array
(
[name] => Bob
[email] => [email protected]
[id] => 1
)
[u2] => Array
(
[name] => Fred
[email] => [email protected]
[id] => 2
)
[u3] => Array
(
[name] => Joe
[email] => [email protected]
[id] => 3
)
)
EDIT: после большого количества бенчмаркинга я предлагаю версию Glass Robots для обработки переменного количества массивов, это медленнее, чем его, очевидно, но быстрее, чем мой оригинал:
function test_my_new(){
$args=func_get_args();
$keys=array_shift($args);
$vkeys=array_shift($args);
$results=array();
foreach($args as $key=>$array){
$vkey=array_shift($vkeys);
foreach($array as $akey=>$val){
$result[$keys[$akey]][$vkey]=$val;
}
}
return $result;
}
$keys=array('u1','u2','u3');
$names=array('Bob','Fred','Joe');
$emails=array('[email protected]','[email protected]','[email protected]');
$ids=array(1,2,3);
$vkeys=array('name','email','id');
test_my_new($keys,$vkeys,$names,$emails,$ids);
Ответы
Ответ 1
Лично для удобства чтения я бы сделал это следующим образом:
$keys = array('u1','u2','u3');
$names = array('Bob','Fred','Joe');
$emails = array('[email protected]','[email protected]','[email protected]');
$ids = array(1,2,3);
$result = array();
foreach ($keys as $id => $key) {
$result[$key] = array(
'name' => $names[$id],
'email' => $emails[$id],
'id' => $ids[$id],
);
}
Ответ 2
Я не проверял эффективность, но в своем решении я использую только стандартные функции (они должны быть оптимизированы) без пользовательского сопоставления и циклирования вне их:
// assigning the data from your question
$keys = array('u1','u2','u3');
$names = array('Bob','Fred','Joe');
$emails = array('[email protected]','[email protected]','[email protected]');
$ids = array(1,2,3);
// creating resulting array
$result = array_merge_recursive(
array_combine($keys, $names),
array_combine($keys, $emails),
array_combine($keys, $ids)
);
Вы попробовали это решение?
Ответ 3
Здесь в основном однострочный набор для множества элементов:
$combined = array_combine($keys, array_map(function ($id, $name, $email) {
return compact('id', 'name', 'email');
}, $ids, $names, $emails));
А вот версия для PHP 5.2 - без анонимных функций:
$combined = array_combine($keys, array_map(create_function('$id, $name, $email',
'return compact("id", "name", "email");'
), $ids, $names, $emails));
Для переменного количества элементов это будет выглядеть так:
function combineValues($keys, $values) {
$vKeys = array_keys($values);
return array_combine($keys, array_map(
function ($values) use ($vKeys) { return array_combine($vKeys, $values); },
call_user_func_array('array_map', array_merge(
array(function () { return func_get_args(); }),
$values))));
}
$combined = combineValues($keys, array('name' => $names, 'email' => $emails, 'id' => $ids));
Я должен признать, что выглядит довольно загадочно, поэтому здесь расширенная версия:
function combineValues($keys, $values) {
$valueKeys = array_keys($values);
$combinedValues = call_user_func_array('array_map', array_merge(array(function () { return func_get_args(); }), $values));
$combinedValues = array_map(function ($values) use ($valueKeys) { return array_combine($valueKeys, $values); }, $combinedValues);
return array_combine($keys, $combinedValues);
}
Для PHP 5.2 - это может выглядеть так:
function combineValues($keys, $values) {
$result = call_user_func_array('array_map', array_merge(
array(create_function('', 'return func_get_args();')),
$values));
array_walk($result,
create_function('&$val, $i, $keys', '$val = array_combine($keys, $val);'),
array_keys($values));
return array_combine($keys, $result);
}
Ответ 4
Просто попробуйте это для объединения массивов multiples (если у вас есть длина массивов)
$array_id = array ('1', '2', '3');
$array1 = array ('arr1_value1', 'arr1_value2', 'arr1_value3');
$array2 = array ('arr2_value1', 'arr2_value2', 'arr2_value3');
$array3 = array ('arr3_value1', 'arr3_value2', 'arr3_value3');
$lenght = count($array_id);
$i = 0;
while ($i < $lenght) {
$result[] = array(
$array_id[$i]
, $array1[$i]
, $array2[$i]
, $array3[$i]
);
$i++;
}
echo '<pre>';
print_r($result);