2012-05-14 11 views
10

Digamos que mi $_POST variables se parece a:

<?php 

Array 
(
    [user_ID] => 65 
    [action] => editpost 
    [originalaction] => editpost 
    [post_author] => 154 
    [empl_bd_dd] => 6 
    [empl_bd_mm] => 5 
    [empl_bd_yy] => 1987 
    [empl_gen] => 1 
    [empl_height] => 155 
    [empl_weight] => 61 
    [empl_arra] => 2 
    [save] => Update 
    [post_it] => 2 
    [empl_pay] => J77 
    [empl_cust] => Married 
    [empl_lang] => Array 
     (
      [0] => EN 
      [1] => FR 
     ) 
    [empl_rent] => 1 
    [name] => Jimmy Nathan 
    [empl_text] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sed interdum leo. Sed et elit quam, tempor placerat neque. Nullam sapien odio, egestas iaculis dictum ut, congue ullamcorper tellus. 
    [empl_sk_0] => 6 
    [empl_sk_1] => 7 
    [empl_sk_2] => 5 
) 

?> 

Como se puede ver que el prefijo todas mis variables de formulario con empl_. Sin tener que especificarlos todos uno a uno, ¿cómo obtengo todas mis variables de forma desde $_POST en una matriz a la menor costo posible? ¿Existe una función de matriz PHP o una combinación de ellas que pueda usar para esto?

Al igual que en CSS donde puede seleccionar todos los elementos con una clase que comienza con el uso de empl[class*="empl_"], ¿hay alguna manera de hacer esto con las claves de matriz en PHP, por ejemplo,

$empl_post = $_POST['empl_*'] 

RESPUESTA EDITADO - corrección impt a la respuesta @ Chris 's: $_POST tiene que ser el primer argumento de array_intersect_key, por ejemplo:

$empl_POST = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST)))); 
+0

gracias por todas las respuestas. eligió la respuesta de @chris a continuación. exactamente lo que estaba buscando. gracias de nuevo, todos, ustedes rockearon. –

Respuesta

14
$r = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST)))); 

que realmente tenga que añadir una bandera PREG_GREP_KEYS a preg_grep() así que no tenemos que hacer todo ese lío ...

En función:

function preg_grep_keys($pattern, $input, $flags = 0) { 
    return array_intersect_key(
     $input, 
     array_flip(preg_grep(
      $pattern, 
      array_keys($input), 
      $flags 
     )) 
    ); 
} 

Editar - desde php 5.6 array_filter ahora tiene algunos nuevos indicadores que le permiten acceder a la clave de matriz en la devolución de llamada del filtro.

function preg_grep_keys($pattern, $input, $flags = 0) { 
    return array_filter($input, function($key) use ($pattern, $flags) { 
      return preg_match($pattern, $key, $flags); 
    }, ARRAY_FILTER_USE_KEY); 
} 

uso

$filtered = preg_grep_keys('/^empl_/', $_POST); 
+0

brillante. gracias, @chris –

+1

"realmente necesitan agregar un indicador 'PREG_GREP_KEYS' ..." - ikr ?? una función menos. : D –

+1

un cambio importante: '$ _POST' tiene que ser el primer argumento para' array_intersect_key'. gracias de nuevo, @chris –

1
$empl_post = array(); 
foreach ($_POST as $k => $v) { 
    if (strpos($k, 'empl_') !== 0) continue; 
    $empl_post[substr($k, 5)] = $v 
} 

print_r($empl_post); 
+3

Y aún más fácil con 'strpos ($ k, 'empl_')! == 0' –

6
function GetPrefixedItemsFromArray($array, $prefix) 
{ 
    $keys = array_keys($array); 
    $result = array(); 

    foreach ($keys as $key) 
    { 
     if (strpos($key, $prefix) === 0) 
     { 
      $result[$key] = $array[$key]; 
     } 
    } 

    return $result; 
} 

Entonces simplemente llame al $myArray = GetPrefixedItemsFromArray($_POST, "empl_");.

+0

Esta es una buena manera. He dado una versión regular de ella, solo en el caso de que quieras probar algo más que el prefijo. –

0

Otro método:

$formVars = $_POST; 
foreach ($formVars as $key=>$value) { 
    if (strpos($key, 'empl_')===false) 
     unset($formVars[$key]); 
} 
0

si quieres algo como esto

$keyPattern = '/^empl_*/'; 
$matching_array = getArrayElementsWithMatchingKeyPattern($_POST,$keyPattern); 

Entonces no creo que hay una manera intrínseca a eso. La mejor manera sería un bucle Foreach con una coincidencia de expresiones regulares.

function getArrayElementsWithMatchingKeyPattern($array,$keyPattern){ 
    $matching_array = array(); 

    foreach ($keyPattern as $k => $v) { 
     if (preg_match($array[$k],$keyPattern) > 0) 
      $matching_array[$k] = $v; 
    } 

    return ($matching_array); 

} 
0

Aquí está una manera ultra-php-ordenada frío para usar php array_walk para especificar un prefijo genérico para eliminar:

$foo = array('k_foo' =>"bar", 
       'k_bar' =>"b0r", 
       'y_foo' =>"b5r", 
       'y_not' =>"b7r", 
      'k_not' =>"b1r"); 

$subsetArray = $foo; 
$key_prefix = "k_"; 

array_walk($foo, 'removeUnwanted', array(&$subsetArray, $key_prefix)); 
var_dump ($subsetArray); 

function removeUnwanted($value, $key, $array){ 
    $prefix = $array[1]; 
    $testArray = &$array[0]; 
    if(strpos($key,$prefix) ===0){ 
     unset($testArray[$key]); 
    } 
} 

Ahora usted puede simplemente llamar gama paseo , con una copia de la matriz de valores y la cadena de prefijos.

0
function GetPrefixedItemsFromArray($array, $prefix, $remplacePref=FALSE) { 
    $keys = array_keys($array); 
    $result = array(); 

    foreach ($keys as $key) { 
     if (strpos($key,$prefix) === 0) { 
      if($remplacePref===TRUE){ 
       $result[str_replace($prefix, "", $key)] = $array[$key]; 
      } 
      elseif($remplacePref!==FALSE && $remplacePref!==""){ 
       $result[str_replace($prefix, $remplacePref, $key)] = $array[$key]; 
      } 
      else{ 
       $result[$key] = $array[$key]; 
      }    
     } 
    } 
    return $result; 
} 

A continuación, sólo tiene que llamar con $ miMatriz = GetPrefixedItemsFromArray ($ POST, "empl") ;.

Cuestiones relacionadas