Mor*_*dur 6 php arrays multidimensional-array
我有一个看起来像这样的数组:
array(
0 => array(
'key1' => 'a',
'key2' => 'b',
'key3' => 'c'
),
1 => array(
'key1' => 'c',
'key2' => 'b',
'key3' => 'a'
),
...
)
Run Code Online (Sandbox Code Playgroud)
我需要一个函数来获取一个只包含(变量)键数的数组,即reduce_array(array('key1','key3')); 应该返回:
array(
0 => array(
'key1' => 'a',
'key3' => 'c'
),
1 => array(
'key1' => 'c',
'key3' => 'a'
),
...
)
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么?如果可能的话,没有任何额外的辅助函数,比如array_filter或array_map,因为我的同事已经抱怨我使用了太多函数.
源数组将始终具有给定的键,因此不需要检查是否存在.
如果值是唯一的,则奖励点(键将始终彼此相关,这意味着如果key1具有值a,则其他键将始终具有值b).
我当前的解决方案有效,但非常笨拙(即使名字很可怕,但找不到更好的):
function get_unique_values_from_array_by_keys(array $array, array $keys)
{
$result = array();
$found = array();
if (count($keys) > 0)
{
foreach ($array as $item)
{
if (in_array($item[$keys[0]], $found)) continue;
array_push($found, $item[$keys[0]]);
$result_item = array();
foreach ($keys as $key)
{
$result_item[$key] = $item[$key];
}
array_push($result, $result_item);
}
}
return $result;
}
Run Code Online (Sandbox Code Playgroud)
另外:
PHP版本是5.1.6.
如果你的同事不喜欢array_filter或array_map,那就是他们缺乏教育和品味.虽然我不建议在工作中燃烧桥梁,但它们经常是解决问题的最佳方法.
function reduce_array($array, $keys) {
$keys_map = array_fill_keys($keys, true);
return array_map(function ($subarray) use ($keys) {
return array_intersect_key($subarray, $keys_map);
}, $array);
}
(注意:我上面使用的匿名函数只能在PHP> = 5.3中使用,所以你可能无法使用它们)
如果必须在没有array_map和匿名函数的情况下执行此操作:
function reduce_array($array, $keys) {
$ret = array();
$keys_map = array_fill_keys($keys, true);
foreach ($array as $subarray) {
array_push($ret, array_intersect_key($subarray, $keys_map));
}
return $ret;
}
简要说明一下:首先,我array_fill_keys用来将键从整数索引数组转换为字符串索引数组(我给它的值true,这里并不重要).这使它成为合适的输入array_intersect_key,可以实现您正在寻找的精确减少.