删除整个数组元素,其中数组元素键数 < 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
)
)
我相信您正试图取消设置“$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)
,因为使用一个变量,您可以提取当前项的值。
下面是我输出这个数组的代码:
// 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
)
)
我相信您正试图取消设置“$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)
,因为使用一个变量,您可以提取当前项的值。