相交键后的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数组排序关联键的主要内容,如果未能解决你的问题,请参考以下文章