【问题标题】:Filter nested array by value existing an other array [duplicate]按另一个数组中存在的值过滤嵌套数组[重复]
【发布时间】:2022-10-18 05:19:50
【问题描述】:

我有嵌套数组 ot 事务。一笔交易包含以下元素:0=TransId、1=ClientId、2=TransactionType、4=Quantity:

$transactions = [
    [1,'CLIENT1','BUY',45.12],
    [7,'CLIENT2','BUY',25.15],
    [11,'CLIENT3','SELL',784.25],
    [14,'CLIENT1','SELL',7.04],
    [19,'CLIENT1','BUY',21.12],
    [21,'CLIENT2','SELL',14.12],
    [27,'CLIENT3','BUY',15.27]
];

我有另一个数组,它代表 VIP 客户的 ID:

$vipClients = ['CLIENT2','CLIENT3'];

我可以通过 foreach 循环计算包含 VIP 客户端事务的数组:

$vipTransactions = [];
foreach ($transactions as $transaction) {
    if (in_array($transaction[1], $vipClients)) {
        array_push($vipTransactions, $transaction);
    }
}
var_dump($vipTransactions);

我更喜欢使用 php 数组函数而不是 foreach 循环。你能建议我,如何过滤嵌套数组和嵌套段的值,它们将被其他数组中的现有值过滤吗?我只想使用数组函数,而不是循环。

【问题讨论】:

  • 你有没有看过array_filter()
  • 这是我的第一个想法。但是在array_filter() 的回调函数中,我需要使用2 个参数:-第一个-$transactions 数组的元素和-第二个-数组$vipTransactions。我不知道,如何将第二个参数传递给回调函数。

标签: php arrays function foreach


【解决方案1】:

您可以使用use 子句将$vipClients 数组传递给array_filter 中的回调,以提供您想要的结果:

$vipTransactions = array_filter($transactions, function ($tx) use ($vipClients) {
  return in_array($tx[1], $vipClients);
});
var_dump($vipTransactions);

或者(正如 @mickmackusa 在 cmets 中指出的那样),如果您使用 arrow function(自 PHP7.4 起可用),则不需要 use 子句:

$vipTransactions = array_filter($transactions,
                                fn($tx) => in_array($tx[1], $vipClients)
                                );

对于这两个函数,输出为:

array(4) {
  [1]=>
  array(4) {
    [0]=>
    int(7)
    [1]=>
    string(7) "CLIENT2"
    [2]=>
    string(3) "BUY"
    [3]=>
    float(25.15)
  }
  [2]=>
  array(4) {
    [0]=>
    int(11)
    [1]=>
    string(7) "CLIENT3"
    [2]=>
    string(4) "SELL"
    [3]=>
    float(784.25)
  }
  [5]=>
  array(4) {
    [0]=>
    int(21)
    [1]=>
    string(7) "CLIENT2"
    [2]=>
    string(4) "SELL"
    [3]=>
    float(14.12)
  }
  [6]=>
  array(4) {
    [0]=>
    int(27)
    [1]=>
    string(7) "CLIENT3"
    [2]=>
    string(3) "BUY"
    [3]=>
    float(15.27)
  }
}

Demo on 3v4l.org

【讨论】:

  • 很好,可以按要求工作。但是作为一个新手,我对关键字use($xy) 感到很困惑。我知道意思 - 将其他参数传递给回调函数。我已经阅读了这里的文档:Anonymous functions,我仍然很困惑。你能给我提供一些文件来帮助我更好地理解 PHP 的这个关键字吗?
  • @Armin66 我建议你谷歌“php 匿名函数”;网上有很多资源可以覆盖它们并谈论use。例如:phptutorial.net/php-tutorial/php-anonymous-functions
  • use 不是箭头函数语法所必需的。
  • @mickmackusa 确实。我已经在答案中对此做了说明。
猜你喜欢
  • 2022-01-16
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2022-01-23
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
相关资源
最近更新 更多