php 筛选对象数组,以保留在平面白名单数组中找到的具有特定属性值的对象

f0ofjuux  于 2023-04-04  发布在  PHP
关注(0)|答案(2)|浏览(117)

我有一个多维数组$currencies

$currencies = array ( 
    0 => (object) array( 'name' => 'algo', 'fullName' => 'Algorand'), 
    1 => (object) array( 'name' => 'ardr', 'fullName' => 'Ardor'), 
    2 => (object) array( 'name' => 'eth', 'fullName' => 'Eth')
);

我只想保留这个数组中带有name的对象:

$filter = ["eth", "algo"];

我做了这个,但它不工作。

$currenciesFiltered = array_filter(
    $currencies,
    function ($value) use ($filter) {
        return in_array($value['name'], $filter);
    }
);

我错在哪里?

vql8enpb

vql8enpb1#

根据错误输出:

Uncaught Error: Cannot use object of type stdClass as array in [...][...]:13

你正在将数组转换为一个对象,但随后试图将其用作数组。当你删除(object)转换时,它就像你期望的那样工作。
如果必须强制转换为对象,请在过滤器之后进行。

nhaq1z21

nhaq1z212#

PHP已经有了原生的优化函数来比较/过滤来自两个可迭代数据集的数据。
array_uintersect(),在这种情况下,非常适合基于值进行过滤。
由于无法预测在迭代期间填充$a$b变量的源数组,因此每次访问数据的尝试都必须回退到备用数组的数据。
因为只有$currencies数组包含对象行,所以检查回调函数中的name属性。如果该属性不存在,则可以知道可访问值属于平面$filter数组。
代码:(Demo

var_export(
    array_uintersect(
        $currencies,
        $filter,
        fn($a, $b) =>
            ($a->name ?? $a)
            <=>
            ($b->name ?? $b)
    )
);

上面的操作与在array_filter()内部进行in_array()迭代调用的效果相同。

var_export(
    array_filter(
        $currencies,
        fn($obj) => in_array($obj->name, $filter)
    )
);

两种技术输出:

array (
  0 => 
  (object) array(
     'name' => 'algo',
     'fullName' => 'Algorand',
  ),
  2 => 
  (object) array(
     'name' => 'eth',
     'fullName' => 'Eth',
  ),
)

相关问题