Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于嵌套对象的值删除数组项_Php_Wordpress - Fatal编程技术网

Php 基于嵌套对象的值删除数组项

Php 基于嵌套对象的值删除数组项,php,wordpress,Php,Wordpress,我正在使用Wordpress菜单数组,我需要循环使用它来根据嵌套对象的值取消设置条目。我现在做这件事的方式似乎很笨拙。我确信我可以通过某种方式在数组中循环来完成这一点,但这超出了技能(更像是一个javascript高手) 虽然这是在Wordpress中,但我认为这更像是一个普通的PHP问题,所以我将其发布在这里 以下是我所拥有的和我正在尝试做的事情的分类: 数组的示例 Array ( [1] => WP_Post Object ( [ID]

我正在使用Wordpress菜单数组,我需要循环使用它来根据嵌套对象的值取消设置条目。我现在做这件事的方式似乎很笨拙。我确信我可以通过某种方式在数组中循环来完成这一点,但这超出了技能(更像是一个javascript高手)

虽然这是在Wordpress中,但我认为这更像是一个普通的PHP问题,所以我将其发布在这里

以下是我所拥有的和我正在尝试做的事情的分类:

数组的示例

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文档的链接也会有所帮助:)