Php 基于嵌套对象的值删除数组项
我正在使用Wordpress菜单数组,我需要循环使用它来根据嵌套对象的值取消设置条目。我现在做这件事的方式似乎很笨拙。我确信我可以通过某种方式在数组中循环来完成这一点,但这超出了技能(更像是一个javascript高手) 虽然这是在Wordpress中,但我认为这更像是一个普通的PHP问题,所以我将其发布在这里 以下是我所拥有的和我正在尝试做的事情的分类: 数组的示例Php 基于嵌套对象的值删除数组项,php,wordpress,Php,Wordpress,我正在使用Wordpress菜单数组,我需要循环使用它来根据嵌套对象的值取消设置条目。我现在做这件事的方式似乎很笨拙。我确信我可以通过某种方式在数组中循环来完成这一点,但这超出了技能(更像是一个javascript高手) 虽然这是在Wordpress中,但我认为这更像是一个普通的PHP问题,所以我将其发布在这里 以下是我所拥有的和我正在尝试做的事情的分类: 数组的示例 Array ( [1] => WP_Post Object ( [ID]
Array
(
[1] => WP_Post Object
(
[ID] => 13378;
[title] => Courses;
[current_item_parent] => 1;
)
[2] => WP_Post Object
(
[ID] => 13375;
[title] => Images;
[current_item_parent] => 1;
)
[3] => WP_Post Object
(
[ID] => 13379;
[title] => Tests;
[current_item_parent] => 1;
)
[4] => WP_Post Object
(
[ID] => 13875;
[title] => Somethings;
[current_item_parent] => 1;
)
)
基本上我想在下面的数组中循环,如果数组->title等于“Courses”或“Tests”,我想将其从数组中取消设置
这就是我目前所拥有的。$hide数组没有被使用,但这正是我想要测试的对象。我没有一个foreach循环,因为我想不出一个方法让它工作
function ad_filter_menu($sorted_menu_objects, $args)
{
$hide = array('Courses', 'Tests'); //doing nothing right now
if ($sorted_menu_objects[1]->title == 'Courses') {
unset($sorted_menu_objects[1]);
};
if ($sorted_menu_objects[3]->title == 'Title') {
unset($sorted_menu_objects[3]);
};
return $sorted_menu_objects;
}
最终结果应该是这样的
Array
(
[2] => WP_Post Object
(
[ID] => 13375
[title] => Images
[current_item_parent] => 1
)
[4] => WP_Post Object
(
[ID] => 13875
[title] => Somethings
[current_item_parent] => 1
)
)
function ad_filter_menu2(&$inArr, $args)
{
$hide = array('Courses', 'Tests');
foreach ($inArr as $idx => &$obj) {
if (in_array($obj->title, $hide)) {
unset($inArr[$idx]);
}
}
}
ad_filter_menu2($inArr, 'sssss');
print_r($inArr);
它总是有一点棘手的不稳定位的数组,你实际上是循环,所以简单的答案是使一个新的,因为你处理原始的
function ad_filter_menu($inArr, $args)
{
$hide = array('Courses', 'Tests');
$newArr = [];
foreach ($inArr as $obj) {
if (! in_array($obj->title, $hide)) {
$newArr[] = $obj;
}
}
return $newArr;
}
函数参数$args
似乎未被使用,但我将其保留在那里,以防您计划稍后实现它
当然,如果您愿意这样做,也可以从原始数组中删除不需要的项
Array
(
[2] => WP_Post Object
(
[ID] => 13375
[title] => Images
[current_item_parent] => 1
)
[4] => WP_Post Object
(
[ID] => 13875
[title] => Somethings
[current_item_parent] => 1
)
)
function ad_filter_menu2(&$inArr, $args)
{
$hide = array('Courses', 'Tests');
foreach ($inArr as $idx => &$obj) {
if (in_array($obj->title, $hide)) {
unset($inArr[$idx]);
}
}
}
ad_filter_menu2($inArr, 'sssss');
print_r($inArr);
只是添加了一些额外的方法来解决问题,使用内置的PHP函数。注意:以下两种解决方案不会改变原始数组,而是返回一个新的“过滤”数组: 或者使用PHP7.4
function ad_filter_menu($array, $args) {
$hide = ['Courses', 'Tests'];
$filtered = array_filter($array, fn ($obj) => in_array($obj->title, $hide));
return $filtered;
}
这是一个非常简单的方法。我用这个把头撞了两个小时。谢谢这是一个很好的选择,但如果添加一些关于如何解决OP问题的解释,您的答案会有所改进,即使用
array\u filter
可以帮助他们做些什么,并且指向函数的官方PHP文档的链接也会有所帮助:)