PHP根据匹配键列表从关联数组中获取值

时间:2014-12-13 18:34:25

标签: php arrays

我正在尝试执行以下操作:

  1. 从数组$post_data ...

  2. 中获取键/值对
  3. 仅在密钥与提供的列表$my_fields ...

  4. 匹配的情况下
  5. 并创建一个只包含匹配数据的新数组。

  6. 例如,从$post_data我想抓取first_namelast_nametitle的键/值对,同时忽略user_email。然后,我想创建一个名为$clean_data的新数组,其中包含这些键/值对。

    下面是我尝试循环遍历$ post_data数组并根据$ my_fields数组拉出匹配项。

    // These are the fields I'd like to get from the $post_data array
    $my_fields = array(
        'first_name',
        'last_name', 
        'title'
    ); 
    
    // This is the raw data. I do not need the 'user_email' key/value pair.
    $post_data = array(
        'first_name' => 'foo',
        'last_name'  => 'bar',
        'title'      => 'Doctor',
        'user_email' => 'fb@gmail.com'
    );
    
    $clean_data = array();
    
    $counter == 0;
    foreach ($post_data as $key => $value) 
    {
        if (array_key_exists($my_fields[$counter], $post_data)) 
        {
            $clean_data[$key] = $value;
        }
        $counter++;
    }
    
    // Incorrectly returns the following: (Missing the first_name field) 
    // Array
    // (
    //     [last_name] => bar
    //     [title] => Doctor
    // )
    

3 个答案:

答案 0 :(得分:2)

不需要循环 - 如果需要,您可以在一行中完成所有操作。这是神奇的功能:

如果您不想修改$ my_fields数组,可以使用array_flip()

为了进一步阅读all other fun,您可以使用数组。

现在MARKY选择了答案,以下是一个例子,说明如何以不同方式完成:

$my_fields = array(
    'first_name',
    'last_name', 
    'title'
); 

$post_data = array(
    'first_name' => 'foo',
    'last_name'  => 'bar',
    'title'      => 'Doctor',
    'user_email' => 'fb@gmail.com'
);

$clean_data = array_intersect_key($post_data, array_flip($my_fields));

这会产生

array (
    'first_name' => 'foo',
    'last_name'  => 'bar',
    'title'      => 'Doctor',
)  

答案 1 :(得分:0)

你应该使用它。

foreach($post_data as $key=>$value){
    if(in_array($key,$my_fields)){
    $clean_data[$key]=$value;
    }
}
print_r($clean_data);

你正朝着正确的方向努力,只是数组中键的匹配必须采用不同的方式。

答案 2 :(得分:0)

你可以用foreach部分替换它,不需要专柜

foreach ($post_data as $key => $value) 
{
    if (in_array($key,$my_fields)) 
    {
        $clean_data[$key] = $value;
    }
}