programing

빈 배열 요소 제거

itsource 2022. 9. 28. 23:32
반응형

빈 배열 요소 제거

배열의 일부 요소는 사용자가 제출한 내용에 따라 빈 문자열입니다.나는 그 요소들을 제거해야 한다.이거 있어요.

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값을 하는 경우입니다.strlen0및 ", " " 입니다.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));

참고 항목: PHP reindex 어레이

OP가 빈 문자열에 대해서만 언급하고 있기 때문에 가장 많이 투표된 답변이 잘못되었거나 적어도 완전히 사실이 아닙니다.자세한 설명은 다음과 같습니다.

'빈'이 무슨 뜻이죠?

우선, 우리는 공허의 의미에 동의해야 한다.다음 항목을 필터링하시겠습니까?

  1. 문자열만("")입니까?
  2. 완전히 잘못된 가치들?($element === false)
  3. 거짓된 가치들?(예를 들어 0, 0.0, "0", NULL, 어레이() 등)
  4. 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) 및 ('')만 빈 문자열로 간주됩니다.

에 대해서는FalseAFIK는 부울값을 송신할 수 없기 때문에 삭제해도 괜찮습니다.

이 **를 사용해 보세요.*

$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

반응형