【问题标题】:Map associative array to another array php将关联数组映射到另一个数组php
【发布时间】:2020-01-09 13:54:08
【问题描述】:

我有一个国家/地区的关联数组,州名是键:

array:13 [
  "Ontario" => null
  "Manitoba" => null
  "New Brunswick" => null
  "Yukon" => null
  "Saskatchewan" => null
  "Prince Edward Island" => null
  "Alberta" => null
  "Quebec" => null
  "Nova Scotia" => null
  "British Columbia" => null
  "Nunavut" => null
  "Newfoundland and Labrador" => null
  "Northwest Territories" => null
] 

我还有一个关联数组,其中包含所有具有值的状态:

array:8 [
  "Alberta" => 17
  "Cairo" => 1
  "Calgary" => 1
  "ddd" => 4
  "gfdxf" => 1
  "New Cairo" => 1
  "Ontario" => 1
  "secret" => 30
] 

现在我需要将第二个数组映射到第一个数组,这样结果就是:

array:13 [
  "Ontario" => 1
  "Manitoba" => 0
  "New Brunswick" => 0
  "Yukon" => 0
  "Saskatchewan" => 0
  "Prince Edward Island" => 0
  "Alberta" => 17
  "Quebec" => 0
  "Nova Scotia" => 0
  "British Columbia" => 0
  "Nunavut" => 0
  "Newfoundland and Labrador" => 0
  "Northwest Territories" => 0
] 

我创建了一个嵌套循环,它工作正常,但是代码很丑,现在有没有更有效的方法?

我的代码:

foreach ($all_states as $state_x => $value_x) {

    foreach ($country_states as $state_y => &$value_y) {

        if (strtolower($state_x) == strtolower($state_y)) {

            $value_y = $value_x;
        } elseif ($value_y == NULL) {

            $value_y = 0;
        }
    }
}

【问题讨论】:

  • 如果您有想要改进的工作代码,那么 StackExchange 代码审查可能更适合您的问题 - 请查看他们的指南。在这里,我们实际上只处理代码问题,或有关特定编程细节的问题。 “它有效,但我认为它很丑”并不是那种问题。如果您所说的“高效”是指执行时间或内存使用方面的性能,那么我们可能会有所帮助,但如果您只是想让代码“更好”,那么恕我直言,这更像是一个代码审查问题。
  • 不只是更好,我有这个问题不仅仅是在一个案例中,它在项目中不止一次发生,所以我需要一种更有效的方法来应对大量输入,但是感谢建议,我不知道 StackExchange 代码审查
  • “我有这个问题”...什么问题? “大”输入有什么问题?如果您在该特定问题上需要帮助,请您具体说明一下。
  • array_mergenull 的值仍将是null 而不是0
  • 您可以使用foreach 循环或array_mergearray_map 的组合来做到这一点 - 我在我的帖子中展示了两种方式 - 随意选择一个看起来更适合你的方式跨度>

标签: php arrays laravel-5


【解决方案1】:

我不知道性能会如何比较,但你可以使用这样的东西,我认为它看起来更干净一些:

foreach ($all_states as $state => $value) {
  if (isset($country_states[$state])) {
    $all_states[$state] = $country_states[$state];
  } else {
    $all_states[$state] = 0;
  }
}

// If you are running a recent PHP version you could shorten this further
foreach ($all_states as $state => $value) {
  $all_states[$state] = $country_states[$state] ?? 0;
}

【讨论】:

    【解决方案2】:

    使用 1 foreach 循环可以更简单地完成:

    $countriesArr = .... // consider this the array with NULL
    $countriesDataArr = ... // consider this to be the array with the values 
    
    foreach( $countriesArr as $k => &$v) {
        $v = isset($countriesDataArr[$k]) ? $countriesDataArr[$k] : 0;            
    }
    

    你也可以使用array_mergearray_mapas:

    $res = array_map(function($v){return 0;}, $countriesArr);
    $res = array_merge($countriesArr, $countriesDataArr);
    

    因为第二个数组会覆盖第一个键:

    如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。

    array_map 会将NULL 的所有值转换为 0

    【讨论】:

      【解决方案3】:

      您可以遍历数组并将其他值映射到它,或者如果它不存在则设置为0

      array_walk($all_states, function(&$v, $k) use($country_states) {
                                  $v = $country_states[$k] ?? 0;
                              });
      

      但是我会合并并保留 null 值或强制转换为整数:

      $all_states = array_map('intval', array_merge($all_states, $country_states));
      

      你也可以像这样得到0s:

      $all_states = array_merge(array_flip(array_keys($all_states)), 
                                $country_states);
      

      或者像这样:

      $all_states = array_merge(array_fill_keys(array_keys($all_states), 0), 
                                $country_states);
      

      【讨论】:

        【解决方案4】:

        将第一个数组的值交换为 0,然后将第二个数组中的值替换为第一个:

        <?php
        
        $clothes = 
        [
            'hats' => null,
            'shirts' => null,
            'trousers' => null,
            'pants' => null
        ];
        
        $values = 
        [
            'shirts' => 10,
            'hats' => 2
        ];
        
        var_export(
            array_replace(
                array_fill_keys(array_keys($clothes), 0),
                $values
            )
        );
        

        输出:

        array (
            'hats' => 2,
            'shirts' => 10,
            'trousers' => 0,
            'pants' => 0,
        )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-03
          • 1970-01-01
          • 2015-07-14
          • 2017-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多