2012-05-14 6 views
10

Hãy nói rằng biến $_POST của tôi trông giống như:

<?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 
) 

?> 

Như bạn có thể thấy tôi tiền tố tất cả các biến hình thức của tôi với empl_. Ngắn của việc phải xác định tất cả chúng từng cái một, làm thế nào để tôi có được tất cả các biến dạng của tôi từ $_POST thành một mảng theo cách thanh lịch với chi phí thấp nhất? Có một chức năng mảng PHP hoặc một sự kết hợp của chúng mà tôi có thể sử dụng cho điều này?

Giống như trong CSS nơi bạn có thể chọn tất cả các phần tử có lớp bắt đầu bằng empl sử dụng [class*="empl_"], có cách nào tôi có thể thực hiện điều này bằng các phím mảng trong PHP, ví dụ:

$empl_post = $_POST['empl_*'] 

edited trả lời - chỉnh impt để trả lời @ Chris 's: $_POST phải là đối số đầu tiên để array_intersect_key, ví dụ:

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

cảm ơn tất cả các câu trả lời. đã chọn câu trả lời của @chris dưới đây. chính xác những gì tôi đã tìm kiếm. cảm ơn một lần nữa, tất cả mọi người, y'all rock. –

Trả lời

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

họ thực sự cần thêm một lá cờ PREG_GREP_KEYS-preg_grep() vì vậy chúng tôi không cần phải làm tất cả những mớ hỗn độn ...

Là một chức năng:

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

Chỉnh sửa - vì php 5.6 array_filter bây giờ có một số cờ mới cho phép bạn truy cập vào khóa mảng trong bộ lọc gọi lại.

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); 
} 

sử dụng

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

rực rỡ. cảm ơn, @chris –

+1

"họ thực sự cần thêm cờ' PREG_GREP_KEYS' ... "- ikr ?? một hàm ít hơn. : D –

+1

một thay đổi quan trọng: '$ _POST' phải là đối số đầu tiên cho' array_intersect_key'. cảm ơn một lần nữa, @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

Và thậm chí dễ dàng hơn với '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; 
} 

Sau đó, chỉ cần gọi với $myArray = GetPrefixedItemsFromArray($_POST, "empl_");.

+0

Đây là một cách hay. Tôi đã đưa ra một phiên bản regex của nó, chỉ trong trường hợp bạn muốn thử một cái gì đó nhiều hơn chỉ là tiền tố. –

0

Một phương pháp:

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

Nếu bạn muốn một cái gì đó như thế này

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

Sau đó, tôi không nghĩ rằng có một cách sẵn có để đó. Cách tốt nhất sẽ là vòng lặp foreach với kết hợp regex.

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

Đây là một cách siêu php-gọn gàng mát mẻ để sử dụng php array_walk để xác định một tiền tố tổng quát để loại bỏ:

$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]); 
    } 
} 

Bây giờ bạn chỉ có thể gọi cho mảng đi bộ , với bản sao của mảng giá trị và chuỗi tiền tố.

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; 
} 

Sau đó, chỉ cần gọi với $ myArray = GetPrefixedItemsFromArray ($ POST, "empl") ;.