【问题标题】:Merge arrays by suffix of keys PHP通过键后缀合并数组 PHP
【发布时间】:2018-10-29 07:50:57
【问题描述】:

我有两个数组,我想根据键后缀合并为一个。

$keys = array(
  'staff_first_name' => NULL,
  'staff_last_name' => NULL,
  'staff_years' => NULL
);


$submitted_values = array( 
   'first_name' => 'jon',
   'last_name' => 'doe',
   'years' => 5
);

我知道我可以使用here 所示的函数并对其进行修改。

但是是否有一个本地 php 函数可以完成此操作。我尝试使用array_merge_recursive,但在查看文档后它不会做我需要的事情。

$wanted_array = array(
   'staff_first_name' => 'jon',
   'staff_last_name' => 'doe',
   'staff_years' => 5
);

【问题讨论】:

  • 我认为您不应该在没有指定确切的键关系的情况下盲目地用用户提供的数据替换数组元素。如果这是我的项目,我会同步密钥以进行合并,然后调用 array_replace。 $submitted_values 真的是 $_GET 吗?
  • 如果是 GET 或 POST,修复关联名称应该很容易。比做编码来匹配它要好得多。
  • @mickmackusa 提交的值是经过清理的 $_POST。 $keys 数组实际上并不保存数据,只是键是我在 $_POST 数组中查找的字段。
  • 那么您也在寻找它们吗?这意味着您需要在合并之前将它们从提交的值中过滤掉?
  • @OrlandoP 查看我的更新答案

标签: php arrays merge associative-array


【解决方案1】:

如果您知道两个数组大小相同,顺序相同,则可以使用array_combinearray_keys

$wanted_array = array_combine(array_keys($keys), $submitted_values);

【讨论】:

    【解决方案2】:

    因为它是每个键上相同的后缀,所以我们无需担心。
    如果我们对数组进行 ksort 排序,它们应该被排序相同,因为后缀在所有键数组中都是相同的。

    $keys = array(
       'staff_first_name' => NULL,
       'staff_last_name' => NULL,
       'staff_years' => NULL
    );
    
    
    $values = array( 
        'years' => 5,
        'first_name' => 'jon',
        'last_name' => 'doe',
    );
    
    ksort($values);
    ksort($keys);
    Var_dump(array_combine(array_keys($keys), $values));
    

    我故意将年份放在首位以表明它有效。
    https://3v4l.org/cBNhk


    如果您需要将 $_POST 减少到只有这些数组项以便能够组合它们,您可以使用 preg_grep、array_flip、array_values 和 array_intersect_key 的组合从数组中过滤掉想要的项。

    $val = preg_grep("/first_name|last_name|years/",array_values(array_flip($values)));
    
    $values = Array_intersect_key($values, array_flip($val));
    ksort($values);
    ksort($keys);
    Var_dump(array_combine(array_keys($keys), $values));
    

    我添加了一些额外的项目来模拟更大的混合 $_POST 数组。
    https://3v4l.org/a3ju1

    【讨论】:

      【解决方案3】:

      这是我必须恳求 OP 重新考虑他们的流程的问题之一。它只会使您的代码复杂化以引入不会立即与您的表单字段名称同步的关联键。这是我能给你的最好建议:声明一个键的白名单并为每个键分配默认值,然后过滤,然后替换。

      由于你的值都是null,你的代码可以通过调用array_fill_keys()变得更干。

      以下代码可以写成一行代码,但为了展示每一步,我在每次函数调用后将数组打印到屏幕上。

      代码:(Demo)

      $defaults = array_fill_keys(['first_name', 'last_name', 'years'], null);
      var_export($defaults);
      
      $_GET = [
               'last_name' => 'doe',
               'Hackers' => 'can be naughty',
               'years' => 5
              ];
      var_export($_GET);
      
      $screened = array_intersect_key($_GET, $defaults);
      var_export($screened);
      
      $replaced = array_replace($defaults, $screened);
      var_export($replaced);
      

      输出:

      array (
        'first_name' => NULL,
        'last_name' => NULL,
        'years' => NULL,
      )array (
        'last_name' => 'doe',
        'Hackers' => 'can be naughty',
        'years' => 5,
      )array (
        'last_name' => 'doe',
        'years' => 5,
      )array (
        'first_name' => NULL,
        'last_name' => 'doe',
        'years' => 5,
      )
      

      ...附言如果您将任何值发送到数据库,请确保使用预准备语句和占位符。

      【讨论】:

      • @Orlando 哎呀我应该使用 $_POST。流程逻辑保持不变。
      • 感谢您的输入,是的,这更有意义。由于表单和支持不同类型的提交,我开始采用 hacky 方式,但我将改为使用不同的表单并遵循这种模式。谢谢
      猜你喜欢
      • 2014-02-11
      • 2011-06-12
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多