【问题标题】:Defining values to specific indexes of a multidimensional array [duplicate]为多维数组的特定索引定义值
【发布时间】:2021-12-08 08:38:05
【问题描述】:

我正在尝试创建一个函数,它将新值分配给多维数组中的特定索引:

  1. 我有这样的数组:

    数据[i]['checkin'];

    数据[i]['结帐'];

    数据[i]['content'][x]['price'];

    数据[i]['content'][x]['profit'];

    数据[i]['content'][x]['exchangerate'];

我的函数的第一个参数将获取数组,第二个参数将获取我要重新定义的索引:

例如:

 function defineNewValues(&$arr, $keys) {
     //logic
 }

调用函数:

defineNewValues($myArray, [
'data.*.content.*.price' => 0,
'data.*.content.*.profit => 0,
]);

我相信递归是解决我的问题的关键, 但是真的不知道怎么解决。

谢谢。

【问题讨论】:

  • 使用这样的 $keys 数组,您将不得不编写一个解析器来处理它并将其转换为一些可以运行的实际代码。当几个简单的 foreach 循环很容易完成时,你真的需要吗
  • 我希望该函数具有通用性,并且可以解决许多情况下不同结构的数组,关于格式.. 我想用点分隔符来分解字符串
  • 那你还是开始写吧
  • 我尝试了超过 3 天没有成功..
  • 对于重复的解决方案,只需使用字符串路径,对于新的动态元素,使用 .. 而不是 .*.。作为'data..content..price'

标签: php arrays multidimensional-array


【解决方案1】:

这样的事情可以吗?

我只要求你研究这段代码而不是实现它,原因很简单,将来你可能会遇到同样类型的问题。


  function setValue($key,$value,&$array){
    $find_parts = explode(".", $key);
    $find = $find_parts[0]??null;
    if ($find!=null){
      if ($find == "*"){
        array_shift($find_parts);
        foreach($array as &$sub_array){
            setValue(implode(".",$find_parts),$value,$sub_array);
        }
      }else{
        if (count($find_parts)>1){
          if (array_key_exists($find,$array)){
            array_shift($find_parts);
            setValue(implode(".",$find_parts),$value,$array[$find]);
          }
        }else{
          if (array_key_exists($find,$array)){
            $array[$find] = $value;
          }
        }
      }
    }
  }

 function defineNewValues(&$arr, $keys) {
    foreach($keys as $key=>$value){
      setValue($key,$value,$arr);
    }
 }
 
 $myArray=[
    "data"=>[
        "a"=>[
            "content"=>[
                "aa"=>[
                    "price" => 3,
                    "profit" => 2,
                    "other" => 1
                ],
                "ab"=>[
                    "price" => 3,
                    "profit" => 2,
                    "other" => 2
                ]
            ]
        ],  
        "b"=>[
            "content"=>[
                "ba"=>[
                    "price" => 3,
                    "profit" => 2,
                    "other" => 4
                ],
                "bb"=>[
                    "price" => 3,
                    "profit" => 2,
                    "other" => 5
                ]
            ]
        ],
    ]    
 ];
 
 defineNewValues($myArray, [
    "data.*.content.*.price" => 0,
    "data.*.content.*.profit" => 0,
 ]);
 
 print_r($myArray);

/* OUTPUT
Array
(
    [data] => Array
        (
            [a] => Array
                (
                    [content] => Array
                        (
                            [aa] => Array
                                (
                                    [price] => 0
                                    [profit] => 0
                                    [other] => 1
                                )
                            [ab] => Array
                                (
                                    [price] => 0
                                    [profit] => 0
                                    [other] => 2
                                )
                        )
                )
            [b] => Array
                (
                    [content] => Array
                        (
                            [ba] => Array
                                (
                                    [price] => 0
                                    [profit] => 0
                                    [other] => 4
                                )
                            [bb] => Array
                                (
                                    [price] => 0
                                    [profit] => 0
                                    [other] => 5
                                )
                        )
                )
        )
)
*/

【讨论】:

  • 当然我会研究它,而不仅仅是实现它。正如有人评论的那样,“你为什么不使用 2-3 个 foreach 循环来解决你的问题”。答案是我一直想学习如何以正确和专业的方式进行思考。我会阅读你的代码(希望能理解:)),
  • 那是你需要的吗?
  • 我会学习你的代码并回复评论:)
  • 如果您有任何疑问或问题,欢迎您
  • 首先,我测试了它,它就像一个魅力!非常聪明地解决了我的问题,100%。继续学习它。非常感谢,我很伤心,因为我的水平,我不能投票,这里有没有管理员投票给我?哈哈
【解决方案2】:

由于您要替换的键只出现在数据的一个级别,因此该解决方案实际上并不需要考虑整个数组结构。您可以替换每个价格和利润键。

array_walk_recursive($example, function(&$value, $key) {
    if (in_array($key, ['price', 'profit'])) {
        $value = 0;
    }
});

根据您对另一个答案的评论,我对“正确和专业的方式”的看法是,我们应该尽量以最简单的方式解决问题,因为简单的解决方案易于维护。

【讨论】:

  • 正确的观察,他需要的是理解如何处理这类问题,但我给他写了一个例子,他可以用它来理解如何去做。在所有情况下,如果他编写了一个考虑所有情况的好代码,那么它甚至不需要维护并且将来很容易回收。
  • @GianfrancescoAurecchia 我希望这似乎并不是我的意思是暗示您的回答有任何负面影响。这不是我的本意,而且我确实认为了解如何解决所提出的问题也很有价值。
  • 如果我显得粗鲁,我很抱歉,确实更多的观点更好
  • @GianfrancescoAurecchia 一点也不。不用担心!
猜你喜欢
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多