删除整个数组元素,其中数组元素键数 < 2 in PHP

Remove the whole array elements, where array element key count < 2 in PHP

下面是我输出这个数组的代码:

 // update users
$where_in = array('1102','');
$admin_data = $this->db->select('id,email,domain')->where_in('id',$where_in)->get('users')->result();

echo "<pre>";print_r($admin_data);

current output array

1102,
Array
(
    [0] => stdClass Object
        (
            [id] => 1
        )

)
1111, 
Array
(
    [0] => stdClass Object
        (
            [id] => 1132
        )

    [1] => stdClass Object
        (
            [id] => 1133
        )

)

我正在尝试通过这样做来完成,但没有得到预期的结果。

foreach ($admin_data as $key) {

    if (count($admin_data) < 2) {
        unset($admin_data);
    }
}

预期结果:我想删除整个数组元素,其中数组键小于 2。我希望只获得键数超过 1 的数组,如下所示:

1111, 
    Array
    (
        [0] => stdClass Object
            (
                [id] => 1132
            )
    
        [1] => stdClass Object
            (
                [id] => 1133
            )
    
    )

我不确定我是否理解,但是如果你有一个数组数组并且想要删除少于 2 个元素的内部数组,你可以这样做:

<?php

$original = [
    ["a"],
    ["b", "c"],
];

$filtered = array_filter(
    $original,
    function ($innerArray) {
        return count($innerArray) >= 2;
    }
);

print_r($filtered);

结果是

Array
(
    [1] => Array
        (
            [0] => b
            [1] => c
        )

)

PHP Fiddle

我相信您正试图取消设置“$admin_data”数组中的元素,但是您在数组本身上调用了 unset。如果将数组元素的索引与元素本身一起传递到循环中,则可以检查元素是否少于两个内部元素,并相应地取消设置该元素。

$elementsToRemove = [];
foreach($admin_data as $index => $key) {
    if (count($key) < 2) {
        $elementsToRemove[] = $index;
    }
}

$newArray = array_diff_key($admin_data, array_flip($elementsToRemove));

再次检查你的代码,它包含一些逻辑问题:

foreach ($admin_data as $key) {
    if (count($admin_data) < 2) {
        unset($admin_data);
    }
}

如果 $admin_data 有一项,则 if (count($admin_data) < 2) 测试为真并且
unset($admin_data); 被执行。这意味着(简化)$admin_data 的所有内容都被删除。
如果 $admin_data 有两个或更多项,则 if (count($admin_data) < 2) 测试永远不会为真。每次迭代都是如此。
这两种情况都不合逻辑,因为您不需要 foreach 循环来使该测试起作用。此外,您可能不想删除 $admin_data 内容。

您需要做的是遍历 $admin_data 个项目,检查该项目是否是一个数组,如果该数组有一个项目,则从 $admin_data 中删除该项目大批。或者您可以创建另一个仅包含有效项目的数组。

这是一个可能的例子:

/* unset the item if it is an array with one item */
foreach ($admin_data as $key => $value) {
    if (is_array($value) && count($value) === 1) {
        unset($admin_data[$key]);
    }
}

/* create a new array with the valid items */
$valid_admin_data = [];
foreach ($admin_data as $key => $value) {
    if (is_array($value) && count($value) > 1) {
        $valid_admin_data[$key] = $value;
    }
}

我还建议您再读一遍 foreach documentation。此外,与变量名称保持一致,因为它有助于避免误解:例如,foreach ($admin_data as $key) 最好命名为 foreach ($admin_data as $value),因为使用一个变量,您可以提取当前项的值。