【问题标题】:Php Array sorting assoc key after intersect key相交键后的PHP数组排序关联键
【发布时间】:2015-11-22 23:59:34
【问题描述】:

目前我有这个:

$pattern = array('industry_id','category_id','subcategory_id');

$data = array('advert_id' => string '261501' (length=6)
  'advert_type_id' => string '7' (length=1)
  'user_id' => string '6221' (length=4)
  'industry_id' => string '17' (length=2)
  'category_id' => string '769' (length=3)
  'subcategory_id' => string '868' (length=3)
  'model' => string 'Custom Semi Drop Deck Trailer' (length=29)
  'description' => string 'Industry: Trailer );

然后:

array_intersect_key(  $data , array_flip($pattern) );

使用array_interect_key & array_flip 根据$pattern$data 获取值,我会得到这样的结果:

array (size=3)
  'category_id' => string '769' (length=3)
  'subcategory_id' => string '930' (length=3)
  'industry_id' => string '17' (length=2)

不幸的是,您可以看到结果键排序与我在$pattern 中声明的不同。有没有一种速记方法可以像我在$pattern 中声明的那样对其进行排序,因为在此之后我想内爆数组并执行类似industry_id.category_id.subcategory_id 的操作,而无需对键进行硬编码。

【问题讨论】:

    标签: php arrays sorting array-intersect


    【解决方案1】:

    既然您已经找到了 array_intersect_key 方法,它不会为您提供所需的 $pattern 键顺序,请尝试以下方法:

    // since original $pattern is not ASSOC (only vals)
    // flip it so defined vals become keys
    $pattern_flipped = array_flip($pattern);
    $result = array();
    foreach ($pattern_flipped as $k => $v) {
    
        if (isset($data[$k])) {
            $result[$k] = $data[$k];
        }
    }
    var_dump($result); // test
    
    // can use original 0 1 2 dynamic keys for concatenation
    echo $result[$pattern[0]], $result[$pattern[1]], $result[$pattern[2]], '<br>';
    // or use hardcoded keys
    echo $result['industry_id'], $result['category_id'], $result['subcategory_id'], '<br>';
    

    【讨论】:

      【解决方案2】:

      你知道我不确定你是如何得到你描述的结果的。我试过你的代码,我得到了

      array (size=3)
         'industry_id' => string '17' (length=2)
         'category_id' => string '769' (length=3)
         'subcategory_id' => string '868' (length=3)
      

      您可以使用 array_filter 以另一种方式完成此操作

      $newData = array_filter($data, function($key) use ($pattern) {
          if (in_array($key, $pattern))
              return true;
      }, ARRAY_FILTER_USE_KEY)
      

      【讨论】:

      • 如果我没记错的话, array_filter 方法将进行匹配,并保留键,但按照原始 $data 数组的顺序,这不是他想要的。他希望 (如果我理解正确的话) 结果数组具有与 $pattern 相同的键顺序。一种简单的方法是通过一个简单的循环检查我的答案。
      • @IvanVeštić array_filter 按顺序遍历数据,因此模式的顺序无关紧要,它将始终按原始数据的顺序返回。话虽如此,我也用 OP 的方法得到了正确的结果。你的循环也有效,我认为这是一个偏好问题(虽然我没有比较进程速度)
      • @IvanVeštić 抱歉,只是看了一下,我没有正确阅读您的评论,OP 的模式按原始数据的顺序排列。我认为他们想要 ti 的原始顺序。
      • 他对最初发布的问题进行了编辑,修改了一些键名,并在示例代码下方添加了关于未按正确顺序获得结果的注释。所以我假设他希望结果具有键的 $pattern 顺序,但是当然如果 $data 和 $pattern 顺序最初都匹配,那么这里似乎可以应用多种方法。但是,如果 $pattern 键顺序很重要,$data 键顺序更改将不再获得预期结果。附:无论如何感谢您的反馈:)
      • @IvanVeštić 和你一样,我投票支持你的答案,我想我会把我的留在这里,但如果没有别的例子来阅读这个问题;)
      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2021-01-11
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多