Mor*_*dur 6 php arrays multidimensional-array
我有一个看起来像这样的数组:
array(
  0 => array(
    'key1' => 'a',
    'key2' => 'b',
    'key3' => 'c'
  ),
  1 => array(
    'key1' => 'c',
    'key2' => 'b',
    'key3' => 'a'
  ),
  ...
)
我需要一个函数来获取一个只包含(变量)键数的数组,即reduce_array(array('key1','key3')); 应该返回:
array(
  0 => array(
    'key1' => 'a',
    'key3' => 'c'
  ),
  1 => array(
    'key1' => 'c',
    'key3' => 'a'
  ),
  ...
)
最简单的方法是什么?如果可能的话,没有任何额外的辅助函数,比如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;
}
另外:
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,可以实现您正在寻找的精确减少.
| 归档时间: | 
 | 
| 查看次数: | 3500 次 | 
| 最近记录: |