Programing

값으로 PHP 배열 삭제 (키 아님)

lottogame 2020. 9. 29. 07:12
반응형

값으로 PHP 배열 삭제 (키 아님)


다음과 같이 PHP 배열이 있습니다.

$messages = [312, 401, 1599, 3, ...];

값이 포함 된 요소 $del_val(예 :)를 삭제하고 $del_val=401싶지만 해당 키를 모릅니다. 도움이 될 수 있습니다. 각 값은 한 번만있을 수 있습니다 .

이 작업을 수행하는 가장 간단한 기능을 찾고 있습니다.


사용 array_search()하고 unset, 다음을 시도하십시오

if (($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()을 사용하여 원래 배열에서 해당 요소를 제거하는 데 사용할 수있는 발견 한 요소의 키를 반환합니다 unset(). FALSE실패 하면 반환 되지만 성공하면 false-y 값을 반환 할 수 있습니다 ( 0예 : 키일 수 있음 ). 이것이 엄격한 비교 !==연산자가 사용되는 이유 입니다.

if()문은 array_search()값을 반환 했는지 확인하고 반환 된 경우에만 작업을 수행합니다.


음, 배열에서 요소를 삭제하는 것은 기본적으로 하나의 요소와 차이설정 하는 것입니다.

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

그것은 멋지게 일반화되며, 원하는 경우 동시에 원하는만큼 많은 요소를 제거 할 수 있습니다.

면책 조항 : 내 솔루션은 변경되는 수락 된 답변과 달리 이전 버전을 그대로 유지하면서 배열의 새 복사본을 생성합니다. 필요한 것을 선택하십시오.


한 가지 흥미로운 방법은 다음을 사용하는 것입니다 array_keys().

foreach (array_keys($messages, 401, true) as $key) {
    unset($messages[$key]);
}

array_keys()함수는 두 개의 추가 매개 변수를 사용하여 특정 값에 대한 키만 반환하고 엄격한 검사가 필요한지 여부 (예 : 비교를 위해 === 사용)를 반환합니다.

또한 동일한 값 (예 :)을 가진 여러 배열 항목을 제거 할 수 있습니다 [1, 2, 3, 3, 4].


배열에 해당 값을 가진 하나의 요소 만 포함된다는 것을 확실히 알고 있다면 다음을 수행 할 수 있습니다.

$key = array_search($del_val, $array);
if (false !== $key) {
    unset($array[$key]);
}

그러나 값이 배열에서 두 번 이상 발생할 수있는 경우 다음을 수행 할 수 있습니다.

$array = array_filter($array, function($e) use ($del_val) {
    return ($e !== $del_val);
});

참고 : 두 번째 옵션은 클로저가있는 PHP5.3 이상에서만 작동합니다.


$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);

다음 코드를 살펴보십시오.

$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');

넌 할 수있어:

$arr = array_diff($arr, array('remove_me', 'remove_me_also'));

그러면이 배열을 얻을 수 있습니다.

array('nice_item', 'another_liked_item')

가장 좋은 방법은 array_splice

array_splice($array, array_search(58, $array ), 1);

최고의 이유는 여기 http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/ 에 있습니다 .


다음 코드에 의해 $ messages에서 반복되는 값이 제거됩니다.

$messages = array_diff($messages, array(401));


또는 간단히 수동 방법 :

foreach ($array as $key => $value){
    if ($value == $target_value) {
        unset($array[$key]);
    }
}

어레이를 완전히 제어 할 수 있기 때문에 이것이 가장 안전합니다.


function array_remove_by_value($array, $value)
{
    return array_values(array_diff($array, array($value)));
}

$array = array(312, 401, 1599, 3);

$newarray = array_remove_by_value($array, 401);

print_r($newarray);

산출

Array ( [0] => 312 [1] => 1599 [2] => 3 )


PHP 5.3+가있는 경우 한 줄 코드가 있습니다.

$array = array_filter($array, function ($i) use ($value) { return $i !== $value; }); 

you can do:

unset($messages[array_flip($messages)['401']]);

Explanation: Delete the element that has the key 401 after flipping the array.


To delete multiple values try this one:

while (($key = array_search($del_val, $messages)) !== false) 
{
    unset($messages[$key]);
}

Borrowed the logic of underscore.JS _.reject and created two functions (people prefer functions!!)

array_reject_value: This function is simply rejecting the value specified (also works for PHP4,5,7)

function array_reject_value(array &$arrayToFilter, $deleteValue) {
    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if ($value !== $deleteValue) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

array_reject: This function is simply rejecting the callable method (works for PHP >=5.3)

function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if (!$rejectCallback($value, $key)) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

So in our current example we can use the above functions as follows:

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);

or even better: (as this give us a better syntax to use like the array_filter one)

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
    return $value === 401;
});

The above can be used for more complicated stuff like let's say we would like to remove all the values that are greater or equal to 401 we could simply do this:

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});

single liner code (thanks to array_diff() ), use following:

$messages = array_diff($messages, array(401));

@Bojangles answer did help me. Thank you.

In my case, the array could be associative or not, so I added following function

function test($value, $tab) {

 if(($key = array_search($value, $tab)) !== false) {
    unset($tab[$key]); return true;

 } else if (array_key_exists($value, $tab)){
        unset($tab[$value]); return true;

 } else {
    return false; // the $value is not in the array $tab
 }

}

Regards


The accepted answer converts the array to associative array, so, if you would like to keep it as a non-associative array with the accepted answer, you may have to use array_values too.

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
    $arr = array_values($messages);
}

The reference is here


As per your requirement "each value can only be there for once" if you are just interested in keeping unique values in your array, then the array_unique() might be what you are looking for.

Input:

$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);

Result:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

If values you want to delete are, or can, be in an array. Use the array_diff function. Seems to work great for things like this.

array_diff

$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);

I know this is not efficient at all but is simple, intuitive and easy to read.
So if someone is looking for a not so fancy solution which can be extended to work with more values, or more specific conditions .. here is a simple code:

$result = array();
$del_value = 401;
//$del_values = array(... all the values you don`t wont);

foreach($arr as $key =>$value){
    if ($value !== $del_value){
        $result[$key] = $value;
    }

    //if(!in_array($value, $del_values)){
    //    $result[$key] = $value;
    //}

    //if($this->validete($value)){
    //      $result[$key] = $value;
    //}
}

return $result

Get the array key with array_search().


If you don't know its key it means it doesn't matter.

You could place the value as the key, it means it will instantly find the value. Better than using searching in all elements over and over again.

$messages=array();   
$messages[312] = 312;    
$messages[401] = 401;   
$messages[1599] = 1599;   
$messages[3] = 3;    

unset($messages[3]); // no search needed

A one-liner using the or operator:

($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);

you can refer this URL : for function

array-diff-key()

<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

var_dump(array_diff_key($array1, $array2));
?>

Then output should be,

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

Another idea to delete the value of an array, use array_diff. If I want to

$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));

(Doc : http://php.net/manual/fr/function.array-diff.php)

참고URL : https://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key

반응형