Límite de matriz por caso
Frecuentes
Visto 121 veces
2
¿Existe algún tipo de función de selección para crear una nueva matriz que seleccione solo ciertos elementos con subelementos que coincidan con los casos? Por ejemplo, solo me gustaría tener una matriz que contenga donde [tipo] es "A", así que tenga una matriz final que solo contenga [1] y [2].
[1]
[type] => A
[month] => January
[2]
[type] => A
[month] => February
[3]
[type] => B
[month] => March
¡Gracias!
4 Respuestas
2
function is_type_a($element) { return $element['type'] === 'A'; }
$fiteredArray = array_filter($inputArray, 'is_type_a');
Puede hacerlo de manera más concisa con una función anónima si tiene PHP 5.4.
contestado el 04 de mayo de 12 a las 02:05
1
Simplemente podría reducir esa matriz a las entradas que desea. Tenga en cuenta que esto conservará las claves originales, por lo que puede terminar con una matriz que tenga 0, 1 y 3 como claves si 2 no se estableció durante el proceso.
foreach( $array as $key => &$value ){
if ( $value['type'] != 'A' )
unset( $array[ $key ] );
}
Demostración: http://codepad.org/OG5rguJ8
Otro método es usar array_filter
para reducir iterativamente la matriz una entrada a la vez:
function callbackFunc( $val ) {
return $val['type'] == 'A';
}
$result = array_filter( $array, callbackFunc );
Llamamos a la array_filter
pasando el método en la matriz que nos gustaría filtrar, así como la función de filtrado que hemos creado. Nuestra función se ejecutará contra cada elemento dentro de la matriz, tratando el elemento actual como un $val
variable.
Si la clave de tipo de esa variable se asigna a un valor que es ==
a "A", TRUE
es regresado. De lo contrario, FALSE
es regresado. Cuando la función regresa TRUE
, el valor evaluado se envía al $result
formación. Si FALSE
fue devuelto, el valor no se inserta en el $result
formación.
Al igual que la opción anterior, este método también conservará los valores clave.
Demostración: http://codepad.org/todHBZo7
contestado el 04 de mayo de 12 a las 03:05
Impresionante funciona! ¿Crees que es un método efectivo? Tengo una matriz masiva que necesito reducir, ¡no estoy seguro de cuánto tiempo tomaría esto en relación con otra cosa! - Kevin Murphy
@KevinMurphy Hay muchas maneras de hacer esto para ser completamente honesto. No sé qué requiere su proyecto, por lo que no puedo hablar sobre qué método es mejor para usted. - Sampson
Las llaves originales son exactamente lo que quiero de todos modos, así que esto es perfecto: P - Kevin Murphy
0
function select_custom($array,$param)
{
foreach($array as $k=>$v)
{
if($v['type']==$param)
{
$returnArray[] = $v;
}
}
return $returnArray;
}
contestado el 04 de mayo de 12 a las 00:05
Compruébalo, no hice la prueba. debería ser rápido - krishna deepak
¿Le diste el segundo parámetro a la función? krishna deepak
0
Puede usar array_splice() si conoce los índices de los elementos que desea elegir, si no es como lo sugieren las respuestas anteriores, debe realizar un bucle
contestado el 04 de mayo de 12 a las 02:05
¿Qué es $ elemento en esta función? ¿No sugiere $element['type'] que $element es lo mismo que $inputArray? - Kevin Murphy
No, $elemento[0] sería si $elemento == $inputArray. array_filter pasa todos los elementos de nivel superior de la matriz de entrada a su función de devolución de llamada (is_type_a). Entonces pasaría $inputArray[0], $inputArray[1]...etc/ php.net/manual/en/function.array-filter.php - jason larke
Muy bien, funciona. Supongo que me estoy tropezando con qué $element es... De cualquier manera, funciona y el enlace al manual también ayudó: P - Kevin Murphy
array_filter
recorre la gran matriz llamandois_type_a()
en cada elemento de la misma. Dada su matriz, el primer elemento está en el índice 1, por lo que primero llamais_type_a($inputArray[1])
. Adentrois_type_a
,$element
sería lo mismo que$inputArray[1]
, cuál podría serarray([type]=>A,[month]=>January)
. La segunda llamada,$element
se mostrarán$inputArray[2]
. Y así. - mark Reed¡Gracias por la explicación! ¡Aprecialo mucho! <3 - Kevin Murphy