根据用户提交的内容,数组中的某些元素是空字符串。我需要删除那些元素。我有这个:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
但这是行不通的。$linksArray
仍然有空元素。我也尝试过使用该empty()
功能,但是结果是一样的。
根据用户提交的内容,数组中的某些元素是空字符串。我需要删除那些元素。我有这个:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
但这是行不通的。$linksArray
仍然有空元素。我也尝试过使用该empty()
功能,但是结果是一样的。
Answers:
在处理字符串数组时,您可以简单地使用array_filter()
,它可以方便地为您处理所有这一切:
print_r(array_filter($linksArray));
请记住,如果未提供回调,则将删除所有等于FALSE
(请参见转换为boolean)的数组项。因此,如果您需要保留元素,即确切的string '0'
,则需要一个自定义回调:
// PHP 7.4 and later
print_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));
// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));
// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));
array_filter
应该删除空元素。而且,如果PHP的empty定义与您的定义不太相同,那么您可以使用一个匿名函数来填充callback选项,该函数会抛出不需要的元素。显然,您必须具有php 5.3或更高版本才能使用匿名回叫。stackoverflow.com/questions/2412299/...
false
元素。(php.net/manual/en/function.array-filter.php)
a
第二次设置只会重置第一个。
您可以array_filter
用来删除空元素:
$emptyRemoved = array_filter($linksArray);
如果(int) 0
阵列中有,则可以使用以下命令:
$emptyRemoved = remove_empty($linksArray);
function remove_empty($array) {
return array_filter($array, '_remove_empty_internal');
}
function _remove_empty_internal($value) {
return !empty($value) || $value === 0;
}
编辑:也许您的元素本身并不为空,但包含一个或多个空格...您可以在使用之前使用以下内容array_filter
$trimmedArray = array_map('trim', $linksArray);
scalar
的数组中只有项目,是的。否则,您将无法做到。
function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
array_map()
魔术角色我在那些空数组中有空格!
关于此主题的最流行答案是绝对不正确。
考虑以下PHP脚本:
<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
为什么是这样?因为包含单个“ 0”字符的字符串也将计算为布尔值false,所以即使它不是一个空字符串,也仍然会被过滤。那将是一个错误。
将内置的strlen函数用作过滤函数将起作用,因为它将为非空字符串返回一个非零整数,为一个空字符串返回一个零整数。非零整数在转换为布尔值时始终求值为true,而零整数在转换为布尔值时始终求值为false。
因此,绝对,确定,正确的答案是:
$arr = array_filter($arr, 'strlen');
0
,)""
null
strlen() expects parameter 1 to be string, array given
$linksArray = array_filter($linksArray);
“如果未提供回调,则将删除所有等于FALSE的输入项。” - http://php.net/manual/en/function.array-filter.php
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0"
$myarray = array_filter($myarray); //removes all null values
你可以做
array_filter($array)
array_filter:“如果未提供回调,则将删除所有等于FALSE的输入项。” 这意味着值NULL,0,'0','',FALSE,array()的元素也将被删除。
另一个选择是做
array_diff($array, array(''))
这将删除值为NULL,''和FALSE的元素。
希望这可以帮助 :)
这是一个例子。
$a = array(0, '0', NULL, FALSE, '', array());
var_dump(array_filter($a));
// array()
var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());
var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())
总结一下:
foreach($linksArray as $key => $link)
{
if($link === '')
{
unset($linksArray[$key]);
}
}
print_r($linksArray);
false
和0
。考虑到这是与接受答案的同一分钟发布的(那是不安全且不正确的),因此我只能假设您的8次投票与接受答案的649相较于后者是单行解决方案。
array_filter()
比foreach()
循环更清洁
trim()
,我建议if(is_string($link) && trim($link) === '')
另一个衬里用于从数组中删除空(“空字符串”)元素。
$array = array_filter($array, function($a) {return $a !== "";});
注:此代码刻意保持null
,0
和false
元素。
或者,也许您想先修剪数组元素:
$array = array_filter($array, function($a) {
return trim($a) !== "";
});
注意:此代码还会删除null
和false
元素。
这是我建议的代码:
$myarray = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
我认为使用array_filter
是好的,但还不够,因为值就像space
和\n
,...保留在数组中,通常是不好的。
所以,我建议你使用混合array_filter
和array_map
。
array_map
用于修剪,array_filter
用于删除空值,strlen
用于保留0
值,以及array_values
在需要时用于重新索引。
$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");
// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);
// "a"
$new2 = array_filter(array_map('trim', $myarray));
// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');
// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
var_dump($new1, $new2, $new3, $new4);
array(5) {
[0]=>
" string(1) "
[1]=>
string(1) "
"
[2]=>
string(2) "
"
[4]=>
string(1) " "
[6]=>
string(1) "a"
}
array(1) {
[6]=>
string(1) "a"
}
array(2) {
[5]=>
string(1) "0"
[6]=>
string(1) "a"
}
array(2) {
[0]=>
string(1) "0"
[1]=>
string(1) "a"
}
如果您正在使用数字数组,并且需要在删除空元素之后重新索引该数组,请使用array_values函数:
array_values(array_filter($array));
另请参见:PHP重新索引数组?
投票最多的答案是错误的,或者至少不是完全正确的,因为OP仅在谈论空白字符串。这是一个详尽的解释:
首先,我们必须就空意味着什么达成共识。您是说要过滤掉:
$element === false
)empty()
功能?仅过滤出空字符串:
$filtered = array_diff($originalArray, array(""));
要仅过滤出严格错误的值,必须使用回调函数:
$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
return $var === false;
}
该回调函数对于要过滤掉“假”值的任何组合(除了一些值)也很有用。(例如,过滤每个null
和false
,等等,仅保留0
):
$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
return ($var === 0 || $var === '0');
}
第三和第四种情况(最后出于我们的目的)是等效的,为此,您只需要使用默认值:
$filtered = array_filter($originalArray);
null
和false
,但保留0,则还可以使用php的内置strlen
函数作为回调。
$out_array = array_filter($input_array, function($item)
{
return !empty($item['key_of_array_to_check_whether_it_is_empty']);
}
);
只是想为循环做出贡献...还解决键中的空白...
就我而言,我想在操作完成后保留顺序的数组键(不只是我一直在盯着的奇数。设置代码以查找奇数键对我来说似乎很脆弱,并且对未来不友好。)
我正在寻找更像这样的东西:http : //gotofritz.net/blog/howto/removing-empty-array-elements-php/
array_filter和array_slice的组合可以解决问题。
$example = array_filter($example);
$example = array_slice($example,0);
效率或基准方面一无所知,但确实可行。
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");
foreach ($my as $key => $value) {
if (is_null($value)) unset($my[$key]);
}
foreach ($my as $key => $value) {
echo $key . ':' . $value . '<br>';
}
输出
1:5
2:6
只需一行:更新(感谢@suther):
$array_without_empty_values = array_filter($array);
使用array_filter
函数删除空值:
$linksArray = array_filter($linksArray);
print_r($linksArray);
删除空数组元素
function removeEmptyElements(&$element)
{
if (is_array($element)) {
if ($key = key($element)) {
$element[$key] = array_filter($element);
}
if (count($element) != count($element, COUNT_RECURSIVE)) {
$element = array_filter(current($element), __FUNCTION__);
}
return $element;
} else {
return empty($element) ? false : $element;
}
}
$data = array(
'horarios' => array(),
'grupos' => array(
'1A' => array(
'Juan' => array(
'calificaciones' => array(
'Matematicas' => 8,
'Español' => 5,
'Ingles' => 9,
),
'asistencias' => array(
'enero' => 20,
'febrero' => 10,
'marzo' => '',
)
),
'Damian' => array(
'calificaciones' => array(
'Matematicas' => 10,
'Español' => '',
'Ingles' => 9,
),
'asistencias' => array(
'enero' => 20,
'febrero' => '',
'marzo' => 5,
)
),
),
'1B' => array(
'Mariana' => array(
'calificaciones' => array(
'Matematicas' => null,
'Español' => 7,
'Ingles' => 9,
),
'asistencias' => array(
'enero' => null,
'febrero' => 5,
'marzo' => 5,
)
),
),
)
);
$data = array_filter($data, 'removeEmptyElements');
var_dump($data);
有用!
试试这个****示例
$or = array(
'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
'PersonalInformation.dob' => $this->request->data['User']['dob'],
'User.email' => $this->request->data['User']['email'],
);
$or = array_filter($or);
$condition = array(
'User.role' => array('U', 'P'),
'User.user_status' => array('active', 'lead', 'inactive'),
'OR' => $or
);
我认为array_walk在这里更合适
$linksArray = array('name', ' ', ' 342', '0', 0.0, null, '', false);
array_walk($linksArray, function(&$v, $k) use (&$linksArray){
$v = trim($v);
if ($v == '')
unset($linksArray[$k]);
});
print_r($linksArray);
Array
(
[0] => name
[2] => 342
[3] => 0
[4] => 0
)
我们还从有效值中修剪了空白区域
最后,只有(null),(Boolean False)和('')被视为空字符串
至于False
删除它是可以的,因为AFAIK用户不能提交布尔值。
对于这些类型的事情,最好明确地说明您想要什么和不想要什么。
这将帮助下一个家伙不要因array_filter()
没有回调而感到惊讶。例如,我结束了这个问题,因为我忘记了是否array_filter()
删除NULL
。我浪费了本可以使用下面的解决方案并得到答案的时间。
同样,该逻辑与语言无关,因为可以将代码复制到另一种语言中,而不必了解php函数的行为(如未array_filter
传递回调时)。
在我的解决方案中,一目了然。删除条件以保留某些内容或添加新条件以过滤其他值。
array_filter()
因为我只是向它传递了一个自定义的回调函数,所以请忽略它的实际用法-如果需要,可以继续将其提取到自己的函数中。我只是将其用作糖进行foreach
循环。
<?php
$xs = [0, 1, 2, 3, "0", "", false, null];
$xs = array_filter($xs, function($x) {
if ($x === null) { return false; }
if ($x === false) { return false; }
if ($x === "") { return false; }
if ($x === "0") { return false; }
return true;
});
$xs = array_values($xs); // reindex array
echo "<pre>";
var_export($xs);
这种方法的另一个好处是,您可以将过滤谓词分解为一个抽象函数,该抽象函数对每个数组过滤单个值并构建为可组合的解决方案。
请参阅此示例和内联注释以获取输出。
<?php
/**
* @param string $valueToFilter
*
* @return \Closure A function that expects a 1d array and returns an array
* filtered of values matching $valueToFilter.
*/
function filterValue($valueToFilter)
{
return function($xs) use ($valueToFilter) {
return array_filter($xs, function($x) use ($valueToFilter) {
return $x !== $valueToFilter;
});
};
}
// partially applied functions that each expect a 1d array of values
$filterNull = filterValue(null);
$filterFalse = filterValue(false);
$filterZeroString = filterValue("0");
$filterEmptyString = filterValue("");
$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterNull($xs); //=> [0, 1, 2, 3, false, "0", ""]
$xs = $filterFalse($xs); //=> [0, 1, 2, 3, "0", ""]
$xs = $filterZeroString($xs); //=> [0, 1, 2, 3, ""]
$xs = $filterEmptyString($xs); //=> [0, 1, 2, 3]
echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]
现在,您可以动态创建一个名为filterer()
using 的函数pipe()
,它将为您应用这些部分应用的函数。
<?php
/**
* Supply between 1..n functions each with an arity of 1 (that is, accepts
* one and only one argument). Versions prior to php 5.6 do not have the
* variadic operator `...` and as such require the use of `func_get_args()` to
* obtain the comma-delimited list of expressions provided via the argument
* list on function call.
*
* Example - Call the function `pipe()` like:
*
* pipe ($addOne, $multiplyByTwo);
*
* @return closure
*/
function pipe()
{
$functions = func_get_args(); // an array of callable functions [$addOne, $multiplyByTwo]
return function ($initialAccumulator) use ($functions) { // return a function with an arity of 1
return array_reduce( // chain the supplied `$arg` value through each function in the list of functions
$functions, // an array of functions to reduce over the supplied `$arg` value
function ($accumulator, $currFn) { // the reducer (a reducing function)
return $currFn($accumulator);
},
$initialAccumulator
);
};
}
/**
* @param string $valueToFilter
*
* @return \Closure A function that expects a 1d array and returns an array
* filtered of values matching $valueToFilter.
*/
function filterValue($valueToFilter)
{
return function($xs) use ($valueToFilter) {
return array_filter($xs, function($x) use ($valueToFilter) {
return $x !== $valueToFilter;
});
};
}
$filterer = pipe(
filterValue(null),
filterValue(false),
filterValue("0"),
filterValue("")
);
$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterer($xs);
echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]