matrices - matriz 5x5 php
PHP-Cómo combinar matrices dentro de la matriz (4)
Como fusionar n numero de array en php. Me refiero a cómo puedo hacer el trabajo como:
array_merge(from : $result[0], to : $result[count($result)-1])
O
array_merge_recursive(from: $result[0], to : $result[count($result) -1])
Donde $result
es una matriz con múltiples matrices dentro de esta forma:
$result = Array(
0 => array(),//associative array
1 => array(),//associative array
2 => array(),//associative array
3 => array()//associative array
)
Mi resultado es:
$result = Array(
0 => Array(
"name" => "Name",
"events" => 1,
"types" => 2
),
1 => Array(
"name" => "Name",
"events" => 1,
"types" => 3
),
2 => Array(
"name" => "Name",
"events" => 1,
"types" => 4
),
3 => Array(
"name" => "Name",
"events" => 2,
"types" => 2
),
4 => Array(
"name" => "Name",
"events" => 3,
"types" => 2
)
)
Y lo que necesito es
$result = Array(
"name" => "name",
"events" => array(1,2,3),
"types" => array(2,3,4)
)
Prueba esto
$result = array_merge($array1, $array2);
O, en lugar de array_merge, puede usar la op + que realiza una unión:
$array2 + array_fill_keys($array1, '''');
Realmente me gustó la respuesta de complex857 pero no me funcionó, porque tenía teclas numéricas en mis arreglos que necesitaba preservar.
Utilicé el operador +
para conservar las claves (como se sugiere en PHP array_merge con claves numéricas ) y utilicé array_reduce
para fusionar la matriz.
Por lo tanto, si desea combinar matrices dentro de una matriz a la vez que conserva las claves numéricas, puede hacerlo de la siguiente manera:
<?php
$a = [
[0 => ''Test 1''],
[0 => ''Test 2'', 2 => ''foo''],
[1 => ''Bar''],
];
print_r(array_reduce($a, function ($carry, $item) { return $carry + $item; }, []));
?>
Resultado:
Array
(
[0] => Test 1
[2] => foo
[1] => Bar
)
Si a ti te gustaría:
- comprueba que cada parámetro que entra en array_merge es en realidad una matriz
- Especifique una propiedad particular dentro de una de las matrices para fusionar
Puede utilizar esta función:
function mergeArrayofArrays($array, $property = null)
{
return array_reduce(
(array) $array, // make sure this is an array too, or array_reduce is mad.
function($carry, $item) use ($property) {
$mergeOnProperty = (!$property) ?
$item :
(is_array($item) ? $item[$property] : $item->$property);
return is_array($mergeOnProperty)
? array_merge($carry, $mergeOnProperty)
: $carry;
}, array()); // start the carry with empty array
}
Vamos a verlo en acción ... aquí hay algunos datos:
Estructura simple: matriz pura de matrices para fusionar.
$peopleByTypesSimple = [
''teachers'' => [
0 => (object) [''name'' => ''Ms. Jo'', ''hair_color'' => ''brown''],
1 => (object) [''name'' => ''Mr. Bob'', ''hair_color'' => ''red''],
],
''students'' => [
0 => (object) [''name'' => ''Joey'', ''hair_color'' => ''blonde''],
1 => (object) [''name'' => ''Anna'', ''hair_color'' => ''Strawberry Blonde''],
],
''parents'' => [
0 => (object) [''name'' => ''Mr. Howard'', ''hair_color'' => ''black''],
1 => (object) [''name'' => ''Ms. Wendle'', ''hair_color'' => ''Auburn''],
],
];
Menos simple: Array de matrices, pero quisiera especificar las personas e ignorar el conteo .
$peopleByTypes = [
''teachers'' => [
''count'' => 2,
''people'' => [
0 => (object) [''name'' => ''Ms. Jo'', ''hair_color'' => ''brown''],
1 => (object) [''name'' => ''Mr. Bob'', ''hair_color'' => ''red''],
]
],
''students'' => [
''count'' => 2,
''people'' => [
0 => (object) [''name'' => ''Joey'', ''hair_color'' => ''blonde''],
1 => (object) [''name'' => ''Anna'', ''hair_color'' => ''Strawberry Blonde''],
]
],
''parents'' => [
''count'' => 2,
''people'' => [
0 => (object) [''name'' => ''Mr. Howard'', ''hair_color'' => ''black''],
1 => (object) [''name'' => ''Ms. Wendle'', ''hair_color'' => ''Auburn''],
]
],
];
Ejecutarlo
$peopleSimple = mergeArrayofArrays($peopleByTypesSimple);
$people = mergeArrayofArrays($peopleByTypes, ''people'');
Resultados - Ambos devuelven esto:
Array
(
[0] => stdClass Object
(
[name] => Ms. Jo
[hair_color] => brown
)
[1] => stdClass Object
(
[name] => Mr. Bob
[hair_color] => red
)
[2] => stdClass Object
(
[name] => Joey
[hair_color] => blonde
)
[3] => stdClass Object
(
[name] => Anna
[hair_color] => Strawberry Blonde
)
[4] => stdClass Object
(
[name] => Mr. Howard
[hair_color] => black
)
[5] => stdClass Object
(
[name] => Ms. Wendle
[hair_color] => Auburn
)
)
Diversión adicional : si desea seleccionar una propiedad en una matriz u objeto, como "nombre" de una matriz de objetos de personas (o matrices asociadas), puede usar esta función
function getSinglePropFromCollection($propName, $collection, $getter = true)
{
return (empty($collection)) ? [] : array_map(function($item) use ($propName) {
return is_array($item)
? $item[$propName]
: ($getter)
? $item->{''get'' . ucwords($propName)}()
: $item->{$propName}
}, $collection);
}
El captador es para objetos posiblemente protegidos / privados.
$namesOnly = getSinglePropFromCollection(''name'', $peopleResults, false);
devoluciones
Array
(
[0] => Ms. Jo
[1] => Mr. Bob
[2] => Joey
[3] => Anna
[4] => Mr. Howard
[5] => Ms. Wendle
)
array_merge puede tomar un número variable de argumentos, por lo que con un pequeño truco call_user_func_array puede pasarle la matriz $result
:
$merged = call_user_func_array(''array_merge'', $result);
Esto básicamente se ejecuta como si hubieras escrito:
$merged = array_merge($result[0], $result[1], .... $result[n]);
Actualizar:
Ahora, con 5.6, tenemos el operador ...
para descomprimir arrays a argumentos, para que pueda:
$merged = array_merge(...$result);
Y tienen los mismos resultados. *
* Los mismos resultados siempre que tenga claves enteras en la matriz desempaquetada, de lo contrario obtendrá un E_RECOVERABLE_ERROR : type 4096 -- Cannot unpack array with string keys
error de las E_RECOVERABLE_ERROR : type 4096 -- Cannot unpack array with string keys
.