【问题标题】:PHP remove multidimensional array key on multiple conditionsPHP在多个条件下删除多维数组键
【发布时间】:2019-03-18 20:47:57
【问题描述】:

我有一个下面的 PHP 数组,您可以在其中看到基于“parent_id”和“父”元素的类别/子类别结构。 现在的要求是,在“menu_display_special = 1”条件的基础上,我想删除那个键以及这个键的 id 为 parent_id 的键。

注意:如果“menu_display_special = 1”条件匹配,它应该从数组中删除类别和子类别(如果有)的键。

结果应该只返回一个数组元素。即 id = 2378

Array
(
    [35] => Joomla\CMS\Menu\MenuItem Object
        (
            [id] => 2375            
            [params:protected] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                            [menu_display_special] => 1
                        )
                )
            [parent_id] => 2376
            [parent] => 
        )

    [36] => Joomla\CMS\Menu\MenuItem Object
        (
            [id] => 2377
            [params:protected] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                        )
                )
            [parent_id] => 2376
            [parent] => 1
        )

    [37] => Joomla\CMS\Menu\MenuItem Object
        (
            [id] => 2379
            [params:protected] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                            [menu_display_special] => 1
                        )
                )
            [parent_id] => 2377
            [parent] => 
        )

    [38] => Joomla\CMS\Menu\MenuItem Object
        (
            [id] => 2380
            [params:protected] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                            [menu_display_special] => 1
                        )
                )
            [parent_id] => 2377
            [parent] => 
        )

    [39] => Joomla\CMS\Menu\MenuItem Object
        (
            [id] => 2381
            [params:protected] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                            [menu_display_special] => 1
                        )
                )
            [parent_id] => 2377
            [parent] => 
        )

    [40] => Joomla\CMS\Menu\MenuItem Object
        (
            [id] => 2378
            [params:protected] => Joomla\Registry\Registry Object
                (
                    [data:protected] => stdClass Object
                        (
                        )
                )
            [parent_id] => 2376
            [parent] =>
        )

)

var_export 之后的代码:

array (
  35 => 
  Joomla\CMS\Menu\MenuItem::__set_state(array(
     'id' => '2375',
     'params' =>     
    Joomla\Registry\Registry::__set_state(array(
       'data' => 
      stdClass::__set_state(array(
         'menu_display_special' => '1',
      )),
    )),
     'parent_id' => '2376',
     'parent' => false,
  )),
  36 => 
  Joomla\CMS\Menu\MenuItem::__set_state(array(
     'id' => '2377',
     'params' => 
    Joomla\Registry\Registry::__set_state(array(
       'data' => 
      stdClass::__set_state(array(        
         'menu_display_special' => '1',
      )),
    )),    
     'parent_id' => '2376',
     'parent' => true,     
  )),
  37 => 
  Joomla\CMS\Menu\MenuItem::__set_state(array(
     'id' => '2379',
     'params' => 
    Joomla\Registry\Registry::__set_state(array(
       'data' => 
      stdClass::__set_state(array(
         'menu_display_special' => '1',
      )),
    )),
     'parent_id' => '2377',
     'parent' => false,
  )),
  38 => 
  Joomla\CMS\Menu\MenuItem::__set_state(array(
     'id' => '2380',
     'params' => 
    Joomla\Registry\Registry::__set_state(array(
       'data' => 
      stdClass::__set_state(array(        
         'menu_display_special' => '1',
      )),
    )),
     'parent_id' => '2377',
     'parent' => false,
  )),
  39 => 
  Joomla\CMS\Menu\MenuItem::__set_state(array(
     'id' => '2381',
     'params' => 
    Joomla\Registry\Registry::__set_state(array(
       'data' => 
      stdClass::__set_state(array(        
      )),
    )),
     'parent_id' => '2377',
     'parent' => false,
  )),
  40 => 
  Joomla\CMS\Menu\MenuItem::__set_state(array(
     'id' => '2378',
     'params' => 
    Joomla\Registry\Registry::__set_state(array(
       'data' => 
      stdClass::__set_state(array(
      )),
    )),
     'parent_id' => '2376',
     'parent' => false,
  )),
)

编码尝试:但它返回 2 个数组元素,即 2381 和 2378。它应该只给我 2378,因为 2381 是 2377 的子元素(其 menu_display_special 值为 1)

 $listArray = array_filter($list, 
        function($v) use($list) { 
            return $v->params->get('menu_display_special') != '1' && ($v->parent == TRUE || $list[$v->parent_id]['params']['menu_display_special'] != '1');
        }
 );

【问题讨论】:

  • “告诉我你得到了什么”- 外星人首席法官
  • @MohdAbdulMujib - 别这么苛求了,直接为他写代码吧
  • @Kirtikumar 您从样本数据中得到的确切输出是什么?您的编码尝试在哪里?您的问题无法立即理解。
  • @mickmackusa 已更新问题。请检查一次好吗?
  • 请显示 var_export 数据,这样我们就不必手动重写您的数据。 (或 json 字符串)您必须包含编码尝试。我不回答未经尝试的问题。这是一个开发者提问和回答问题的网站。

标签: php arrays


【解决方案1】:

我不确定您的设计要求是否允许我在递归函数中合并条件,因此我将它们分开以尽量准确。

没有返回值,$array前面有一个&,让它修改原来传入的输入数组。

代码 (Demo)

function recurse(&$array, $pid = null) {
    foreach ($array as $id => $item) {
        if (isset($item->params->data->menu_display_special) && $item->params->data->menu_display_special == 1) { 
            unset($array[$id]);
            recurse($array, $item->id);
        } elseif ($item->parent_id === $pid) {
            unset($array[$id]);
        }
    }
}    

$list = [
    35 => (object)[
        'id' => '2375',
        'params' => (object)[ 
            'data' => (object)[
                'menu_display_special' => '1'
            ]
        ],
        'parent_id' => '2376',
        'parent' => false
    ],
    36 => (object)[
        'id' => '2377',
        'params' => (object)[ 
            'data' => (object)[
                'menu_display_special' => '1'
            ]
        ],
        'parent_id' => '2376',
        'parent' => false
    ],
    37 => (object)[
        'id' => '2379',
        'params' => (object)[ 
            'data' => (object)[
                'menu_display_special' => '1'
            ]
        ],
        'parent_id' => '2377',
        'parent' => false
    ],
    38 => (object)[
        'id' => '2380',
        'params' => (object)[ 
            'data' => (object)[
                'menu_display_special' => '1'
            ]
        ],
        'parent_id' => '2377',
        'parent' => false
    ],
    39 => (object)[
        'id' => '2381',
        'params' => (object)[ 
            'data' => (object)[]
        ],
        'parent_id' => '2377',
        'parent' => false
    ],
    40 => (object)[
        'id' => '2378',
        'params' => (object)[ 
            'data' => (object)[]
        ],
        'parent_id' => '2376',
        'parent' => false
    ],
];

recurse($list);
var_export($list);

输出:

array (
  40 => 
  (object) array(
     'id' => '2378',
     'params' => 
    (object) array(
       'data' => 
      (object) array(
      ),
    ),
     'parent_id' => '2376',
     'parent' => false,
  ),
)

【讨论】:

  • 将来,如果您发布一个完整的、尝试过的、可重现的问题,您可以避免投反对票。如果您有关于 Joomla 的问题,请在 Joomla Stack Exchange 上发布。
猜你喜欢
  • 1970-01-01
  • 2018-02-01
  • 2021-03-05
  • 1970-01-01
  • 2012-05-05
  • 2011-09-20
  • 2013-11-05
  • 1970-01-01
  • 2017-10-19
相关资源
最近更新 更多