【问题标题】:Replace value in multidimensional php array替换多维php数组中的值
【发布时间】:2018-07-24 11:37:37
【问题描述】:

首先,我不得不说我已经检查了一些答案,但它既不是我要找的,也不是我无法完全理解答案以及如何使用它。

我有这个多维数组:

Array
(
    [field_5abcb693a68bc] => Array
        (
            [0] => Array
                (
                    [field_5abcbb1b51ddf] => mortgage
                    [field_5ae58a0b58b58] => 
                    [field_5abcbb1e51de0] => 10
                    [field_5abcbb2051de1] => הידגלה
                    [field_5abcbb2351de2] => 45,654,456
                    [field_5abcbb6251de3] => 
                    [field_5abcbb6651de4] => 04/2017
                    [field_5abcbb6851de5] => 4,454,656
                    [field_5abcbb6b51de6] => 24/07/2018
                    [field_5abcbbb351de7] => 657
                    [field_5abcbbb651de8] => 24/07/2018
                    [field_5abcbbb851de9] => 15
                    [field_5abcbbbb51dea] => yes
                )

        )

)  

我想找到与 mm/yyyy 模式差不多的值。正则表达式是一个不错的选择,我知道如何写条件:

if ( preg_match('/^\d[1-9]\/[1-9][0-9][0-9][0-9]$/',$v) ) {
   //do stuff
}

我想在数组的内部查找该模式,如果匹配,则将数组中的值更改为

$value = '01/' . $value;

表示值“04/2017”更改为“01/04/2017”。
注意:可以更改多个值。
注意:数组 [field_5abcb693a68bc] 中的第一个数组的名称可以变化并获胜在其他情况下不要保持不变。
谢谢。

【问题讨论】:

    标签: php arrays regex


    【解决方案1】:

    使用array_walk_recursive 引用值作为参数而不是回调的常规值参数。

    它会这样工作:

    array_walk_recursive(
        $array,
        function (&$value) {
            if (preg_match('/^\d[1-9]\/[1-9][0-9][0-9][0-9]$/',$value)) {
                $value = '01/' . $value;
            }
        }
    );
    

    查看3v4l.org的结果

    【讨论】:

    • 一个很好的答案。不知道为什么其他支持者错过了这个。
    【解决方案2】:

    您想使用正则表达式模式执行条件替换吗? preg_replace() 似乎很明智。 preg_replace() 很乐意迭代一维数组,因此可以直接向它提供最低级别。

    请注意,我已更改模式分隔符以避免转义正斜杠。我还通过使用\d{3} 量词使模式更简洁。 $0 表示“全字符串匹配”。您不必编写unset() 调用来清除those temporary variables,但一些开发人员认为这是最佳实践,因为它避免了潜在的变量冲突向下脚本。

    代码:(Demo)

    $array = [
        'field_5abcb693a68bc' => [
            0 => [
                'field_5abcbb1b51ddf' => 'mortgage',
                'field_5ae58a0b58b58' => '',
                'field_5abcbb1e51de0' => '10',
                'field_5abcbb2051de1' => 'הידגלה',
                'field_5abcbb2351de2' => '45,654,456',
                'field_5abcbb6251de3' => '',
                'field_5abcbb6651de4' => '04/2017',
                'field_5abcbb6851de5' => '4,454,656',
                'field_5abcbb6b51de6' => '24/07/2018',
                'field_5abcbbb351de7' => '657',
                'field_5abcbbb651de8' => '24/07/2018',
                'field_5abcbbb851de9' => '15',
                'field_5abcbbbb51dea' => 'yes'
            ]
        ]
    ];
    
    foreach ($array as &$set) {
        foreach ($set as &$subset) {
            $subset = preg_replace('~^\d[1-9]/[1-9]\d{3}$~', '01/$0', $subset);
        }
    }
    unset($set, $subset); // avoid future variable interferences
    var_export($array);
    

    输出:

    array (
      'field_5abcb693a68bc' => 
      array (
        0 => 
        array (
          'field_5abcbb1b51ddf' => 'mortgage',
          'field_5ae58a0b58b58' => '',
          'field_5abcbb1e51de0' => '10',
          'field_5abcbb2051de1' => 'הידגלה',
          'field_5abcbb2351de2' => '45,654,456',
          'field_5abcbb6251de3' => '',
          'field_5abcbb6651de4' => '01/04/2017',
          'field_5abcbb6851de5' => '4,454,656',
          'field_5abcbb6b51de6' => '24/07/2018',
          'field_5abcbbb351de7' => '657',
          'field_5abcbbb651de8' => '24/07/2018',
          'field_5abcbbb851de9' => '15',
          'field_5abcbbbb51dea' => 'yes',
        ),
      ),
    )
    

    【讨论】:

      【解决方案3】:

      例如,您可以匿名处理数组的级别,而无需实际知道任何键的名称,例如

      foreach ($arr as $key => &$outer) {
          foreach ($outer as &$inner) {
              foreach ($inner as $k => $v) {
                  if ( preg_match('/^\d[1-9]\/[1-9][0-9][0-9][0-9]$/',$v) ) {
                      $inner[$k] = '01/' . $v;
                  }
              }
          }
      
      }
      

      【讨论】:

      • @mickmackusa 感谢您的提醒。教我发布未经测试的代码:)
      猜你喜欢
      • 1970-01-01
      • 2013-08-31
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多