相交键后的PHP数组排序关联键

Posted

技术标签:

【中文标题】相交键后的PHP数组排序关联键【英文标题】:Php Array sorting assoc key after intersect key 【发布时间】: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 的操作,而无需对键进行硬编码。

【问题讨论】:

【参考方案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ć 和你一样,我投票支持你的答案,我想我会把我的留在这里,但如果没有别的例子来阅读这个问题;)

以上是关于相交键后的PHP数组排序关联键的主要内容,如果未能解决你的问题,请参考以下文章

PHP 数组排序:内置函数算法排序

PHP 数组排序

PHP 数组排序 +php二维数组排序方法

php数组常用函数

如何按给定键的值对关联数组进行排序并在php中维护键? [复制]

php 数组排序