为了账号安全,请及时绑定邮箱和手机立即绑定

根据列值过滤关联行,其中行位于 3d 数组的特定子数组中

根据列值过滤关联行,其中行位于 3d 数组的特定子数组中

PHP
翻翻过去那场雪 2023-11-05 15:46:16
我正在尝试 array_filter() 删除空白的嵌套数组,但我只取回所有嵌套数组。我知道我用错了,但看到了类似的案例,就像我正在尝试的那样。这是数据:[    'ticket_number' => 'sdfsdfsdf 2',    'strategy_id' => '5',    'journal_entries_strategy_conditions' => [        (int) 0 => [            'strategies_condition_id' => ''        ],        (int) 1 => [            'strategies_condition_id' => '1'        ]    ],    'timeframe' => '',]我想删除'strategies_condition_id' => ''但我得到的只是[    (int) 0 => [        'strategies_condition_id' => ''    ],    (int) 1 => [        'strategies_condition_id' => '1'    ]]我认为我使用它是正确的:debug(  array_filter(    $data['journal_entries_strategy_conditions'],     function($value) { return !is_null($value) && $value !== ''; }  ));
查看完整描述

4 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

您$value传递给过滤函数的也是一个关联数组。


因此,您必须检查“值的值”,使用current()使过滤函数与键名无关,从而在需要时使此代码可移植。我将函数参数命名为$entry避免混淆:


$data= [

    'ticket_number' => 'sdfsdfsdf 2',

    'strategy_id' => '5',

    'journal_entries_strategy_conditions' => [

        (int) 0 => [

            'strategies_condition_id' => ''

        ],

        (int) 1 => [

            'strategies_condition_id' => '1'

        ]

    ],

    'timeframe' => '',

];



var_dump(

    array_filter(

        $data['journal_entries_strategy_conditions'],

        function($entry) {

            $value = current($entry);

            return !is_null($value) && $value !== '';

        }

    )

);

结果是:


array(1) {

  [1]=>

  array(1) {

    ["strategies_condition_id"]=>

    string(1) "1"

  }

}


查看完整回答
反对 回复 2023-11-05
?
互换的青春

TA贡献1797条经验 获得超6个赞

因为它是一个嵌套数组,所以您需要走更长的路线并使用 array_column,然后用键的交集替换数组子数组。


$filtered = array_filter(array_column($arr['journal_entries_strategy_conditions'], 'strategies_condition_id'));


$arr['journal_entries_strategy_conditions'] = array_intersect_key($arr['journal_entries_strategy_conditions'], $filtered);


var_dump($arr);

https://3v4l.org/iC66a

通过将其设为单行,可以使其可读性更差。


并且您不需要为此使用自定义函数。

Array_filter 默认删除 '' 和 null 值。


查看完整回答
反对 回复 2023-11-05
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

由于您在过滤数组中有一个关联数组,从技术上讲它不是空的,这就是您的代码不起作用的原因。


如果您希望过滤数组中的指定键(假设该键确实存在)不为空,只需传递该键值,如下所示:


$data = [

        (int) 0 => [

            'strategies_condition_id' => '',

            'test' => '',

            'asd' => 'asd'

        ],

        (int) 1 => [

            'strategies_condition_id' => '1'

        ]

    ];

$key = 'strategies_condition_id';

$result = array_filter($data, function($value) use ($key) {dump($value); return !is_null($value[$key]) && $value[$key] !== ''; });

输出:


array:1 [

  1 => array:1 [

    "strategies_condition_id" => "1"

  ]

]

数组0被跳过,因为它的strategies_condition_id键为空。


还有另一种简单的方法来检查过滤数组中是否有空值:


$data = [

        (int) 0 => [

            'strategies_condition_id' => '',

            'test' => 'test'

        ],

        (int) 1 => [

            'strategies_condition_id' => '1'

        ],

        (int) 2 => [

            'strategies_condition_id' => '2',

            'test' => ''

        ]

    ];

array_filter($data, function($value) { return !in_array('',$value); });

输出:


array:1 [

  1 => array:1 [

    "strategies_condition_id" => "1"

  ]

]


查看完整回答
反对 回复 2023-11-05
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

array_filter()在特定的第一级元素上使用单个元素即可完成这项工作。在函数的回调内部,不需要任何函数调用;只需访问目标关联子数组值并检查它是否为真。这与函数式编码一样简单。

代码:(演示

$array['journal_entries_strategy_conditions'] = array_filter(

    $array['journal_entries_strategy_conditions'],

    fn($row) => $row['strategies_condition_id']

);

与经典循环等效的内容可以unset()有条件地使用。(演示

foreach ($array['journal_entries_strategy_conditions'] as $i => $row) {

    if (!$row['strategies_condition_id']) {

        unset($array['journal_entries_strategy_conditions'][$i]);

    }

}

或者,如果您希望有一个重新索引的子数组,array_splice()这会很有帮助。(演示

foreach ($array['journal_entries_strategy_conditions'] as $i => $row) {

    if (!$row['strategies_condition_id']) {

        array_splice($array['journal_entries_strategy_conditions'], $i, 1);

    }

}


查看完整回答
反对 回复 2023-11-05
  • 4 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信