提问者:小点点

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


我正在处理一个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;
        )
)

基本上,我希望循环遍历下面的数组,如果array->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
        )
)

共1个答案

匿名用户

在实际循环的数组中,取消设置位总是有点棘手的,所以简单的答案是在处理原始数组时创建一个新数组

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似乎没有使用,但我将它留在那里,以防您打算稍后实现

当然,如果您愿意,也可以从原始数组中删除不需要的项

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);