빈 배열 요소 제거
배열의 일부 요소는 사용자가 제출한 내용에 따라 빈 문자열입니다.나는 그 요소들을 제거해야 한다.이거 있어요.
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
하지만 효과가 없어요. $linksArray
을 사용하다 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.empty()
하지만 결과는 같습니다.
문자열 배열을 다룰 때 를 사용하면 이 모든 것을 편리하게 처리할 수 있습니다.
print_r(array_filter($linksArray));
콜백이 제공되지 않을 경우 어레이의 모든 엔트리는FALSE
(부울로 변환 참조)이 제거됩니다.따라서 정확한 문자열과 같은 요소를 보존해야 하는 경우'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 !== "";')));
빈한 후 인덱싱해야 할 경우 다음을 $linksArray = array_values(array_filter($linksArray));
를 사용하여 빈 요소를 제거할 수 있습니다.
$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;
}
편집: 요소 자체가 비어 있는 것이 아니라 하나 이상의 공백이 포함되어 있을 수 있습니다.사용하기 전에 다음을 사용할 수 있습니다.
$trimmedArray = array_map('trim', $linksArray);
이 주제에 대한 가장 인기 있는 답은 완전히 틀렸습니다.
다음 PHP 스크립트를 고려하십시오.
<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
왜 이러한가?단일 '0' 문자를 포함하는 문자열도 부울 false로 평가되므로 빈 문자열이 아니더라도 필터링됩니다.그것은 버그가 될 것이다.
내장된 strlen 함수를 필터링 함수로 전달하면 비어 있지 않은 문자열에는 0이 아닌 정수를 반환하고 빈 문자열에는 0이 반환되므로 기능합니다.0이 아닌 정수는 부울로 변환될 때 항상 true로 평가되며 0 정수는 부울로 변환될 때 항상 false로 평가됩니다.
따라서 절대적이고 확실한 정답은 다음과 같습니다.
$arr = array_filter($arr, 'strlen');
$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())
정리하면:
- 0 또는 '0'은 0과 '0'을 삭제합니다.
- NULL, FALSE 또는 "는 NULL, FALSE 및 "를 삭제합니다.
foreach($linksArray as $key => $link)
{
if($link === '')
{
unset($linksArray[$key]);
}
}
print_r($linksArray);
빈("빈 문자열") 요소를 배열에서 제거하는 다른 라이너입니다.
$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"
}
온라인 테스트:
http://sandbox.onlinephpfunctions.com/code/e02f5d8795938be9f0fa6f4c17245a9bf8777404
숫자 배열로 작업하는 경우 빈 요소를 제거한 후 어레이를 다시 인덱싱해야 하는 경우 array_values 함수를 사용합니다.
array_values(array_filter($array));
OP가 빈 문자열에 대해서만 언급하고 있기 때문에 가장 많이 투표된 답변이 잘못되었거나 적어도 완전히 사실이 아닙니다.자세한 설명은 다음과 같습니다.
'빈'이 무슨 뜻이죠?
우선, 우리는 공허의 의미에 동의해야 한다.다음 항목을 필터링하시겠습니까?
- 빈 문자열만("")입니까?
- 완전히 잘못된 가치들?(
$element === false
) - 거짓된 가치들?(예를 들어 0, 0.0, "0", NULL, 어레이() 등)
- PHP에 하는 것
empty()
능하하??? ???
값을 필터링하려면 어떻게 해야 합니까?
빈 문자열만 필터링하려면:
$filtered = array_diff($originalArray, array(""));
완전히 잘못된 값만 필터링하려면 콜백 함수를 사용해야 합니다.
$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
return $var === false;
}
「값을 하는 를 들면, 「false」의 값을 제외)에도이 됩니다를 들면, 「false」의 모든 값을 합니다).null
★★★★★★★★★★★★★★★★★」false
, 등, 남겨두기만 합니다.0
$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
return ($var === 0 || $var === '0');
}
세 번째와 네 번째 케이스는 (마지막으로) 동등하며, 이를 위해 사용할 필요가 있는 것은 기본값뿐입니다.
$filtered = array_filter($originalArray);
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));
print_r($b)
다차원 배열의 경우
$data = array_map('array_filter', $data);
$data = array_filter($data);
어레이 값을 (문자열)0으로 유지하려면 이 작업을 수행해야 합니다.
$url = array_filter($data, function ($value) {
return (!empty($value) || $value === 0 || $value==='0');
});
$out_array = array_filter($input_array, function($item)
{
return !empty($item['key_of_array_to_check_whether_it_is_empty']);
}
);
function trim_array($Array)
{
foreach ($Array as $value) {
if(trim($value) === '') {
$index = array_search($value, $Array);
unset($Array[$index]);
}
}
return $Array;
}
루프를 대신할 방법을 찾고 싶어서...또한 키의 갭을 해결합니다.
저 같은 경우에는 작업이 완료되었을 때 (홀수뿐만 아니라) 순차적인 어레이 키를 유지하려고 했습니다.이상한 키만 찾도록 코드를 설정하는 것은 저에게 취약하고 미래에 도움이 되지 않는 것처럼 보였습니다.)
저는 이런 것을 찾고 있었습니다.http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
array_filter와 array_slice의 조합이 도움이 됩니다.
$example = array_filter($example);
$example = array_slice($example,0);
효율성이나 벤치마크에 대해서는 잘 모르지만 효과가 있습니다.
다음 스크립트를 사용하여 어레이에서 빈 요소를 제거합니다.
for ($i=0; $i<$count($Array); $i++)
{
if (empty($Array[$i])) unset($Array[$i]);
}
$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
foreach($arr as $key => $val){
if (empty($val)) unset($arr[$key];
}
단 한 줄 : Update (@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);
효과가 있어!
사용 방법에 따라 다른 배열에서 이러한 요소를 잡아 다음과 같은 요소를 사용할 수 있습니다.
foreach($linksArray as $link){
if(!empty($link)){
$new_arr[] = $link
}
}
print_r($new_arr);
여기서는 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
AFIK는 부울값을 송신할 수 없기 때문에 삭제해도 괜찮습니다.
이 **를 사용해 보세요.*
$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_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()
를 사용합니다.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]
언급URL : https://stackoverflow.com/questions/3654295/remove-empty-array-elements
'programing' 카테고리의 다른 글
MariaDB 생성 뷰가 SELECT를 다른(잘못된) 쿼리로 변경합니다. (0) | 2022.09.28 |
---|---|
Node.js의 안전한 랜덤 토큰 (0) | 2022.09.28 |
Python 유닛 테스트는 어디로 진행됩니까? (0) | 2022.09.28 |
null이 아닌 제약조건을 폐기하려면 어떻게 해야 합니까? (0) | 2022.09.28 |
vue.js 응용 프로그램에서 "this" 키워드를 제외할 수 있습니까? (0) | 2022.09.28 |