【问题标题】:PHP array function that returns a subset for given keysPHP数组函数,返回给定键的子集
【发布时间】:2012-09-14 15:12:29
【问题描述】:

我正在寻找这样的数组函数:

$myArray = array(
  'apple'=>'red',
  'banana'=>'yellow',
  'lettuce'=>'green',
  'strawberry'=>'red',
  'tomato'=>'red'
);
$keys = array(
  'lettuce',
  'tomato'
);

$ret = sub_array($myArray, $keys);

$ret 在哪里:

array(
  'lettuce'=>'green',
  'tomato'=>'red'
);

我自己写下来没有问题,问题是我想避免foreach循环并采用内置函数或内置函数的组合。在我看来,这就像一个通用且常见的数组操作 - 如果循环是唯一的选择,我会感到惊讶。

【问题讨论】:

标签: php arrays higher-order-functions built-in


【解决方案1】:

您可以使用array_intersect_key,但它使用带有键和值的第二个数组。它使用键计算数组的交集以进行比较

array_intersect_key

<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);
$array3 = array('green' => '', 'blue' => '', 'yellow' => '', 'cyan' => '');
$array4 = array('green', 'blue', 'yellow', 'cyan');

var_dump(array_intersect_key($array1, $array2));
var_dump(array_intersect_key($array1, $array3));
var_dump(array_intersect_key($array1, $array4));
?>

上面的例子会输出:

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

array(0) {
}

【讨论】:

  • 这是公认的答案吗?根据@Maciej 的回答进行简单修复:array_intersect_key($array1, array_flip($array4));
【解决方案2】:

这行得通:

function sub_array(array $haystack, array $needle)
{
    return array_intersect_key($haystack, array_flip($needle));
}

$myArray = array(
    'apple'=>'red',
    'banana'=>'yellow',
    'lettuce'=>'green',
    'strawberry'=>'red',
    'tomato'=>'red'
);
$keys = array(
    'lettuce',
    'tomato'
);

$ret = sub_array($myArray, $keys);

var_dump($ret);

【讨论】:

  • array_flip 救了我的命。谢谢。
  • 谢谢。新的 php 和来自 R 的子集在微风中完成,我慢慢地开始拉我的头发。这救了我的头皮;)如果我能给你+10,我很乐意。
  • @Joel.O 您可以在问题中添加赏金并奖励它。
  • 这应该是一个内部 PHP 数组函数。
【解决方案3】:
    $ret = array_filter($myArray, function ($key) use ($keys) {
        return in_array($key, $keys);
    }, ARRAY_FILTER_USE_KEY);

【讨论】:

  • 注意:这可能不会返回您期望的结果,因为$keys 变量在匿名函数的外部。请检查 use 关键字 - 如此 stackoverflow 帖子所述:stackoverflow.com/a/8403958/42223
【解决方案4】:

单线:

$subArray = array_intersect_key($items, array_fill_keys($keys, 1));

例子:

<?php
$items = [ 'product_id' => 1234, 'color' => 'green', 'qty' => 5, 'desc' => 'Shirt' ];
$keys = [ 'product_id', 'desc' ];
$subArray = array_intersect_key($items, array_fill_keys($keys, 1));
var_dump($subArray);

生产:

array(2) {
  ["product_id"]=>
  int(1234)
  ["desc"]=>
  string(5) "Shirt"
}

适用于:

  • 数字键,
  • 关联数组,
  • 混合数组,
  • 具有非唯一值的数组

【讨论】:

  • 谢谢你,过去的马特。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
相关资源
最近更新 更多