Límite de matriz por caso

¿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!

preguntado el 03 de mayo de 12 a las 17:05

4 Respuestas

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

¿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 llamando is_type_a() en cada elemento de la misma. Dada su matriz, el primer elemento está en el índice 1, por lo que primero llama is_type_a($inputArray[1]). Adentro is_type_a, $element sería lo mismo que $inputArray[1], cuál podría ser array([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

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

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

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.