72

値が配列に存在するかどうかを見つけて、それを削除するにはどうすればよいですか?削除した後、シーケンシャルインデックスの順序が必要です。

これを行うためのPHP組み込み配列関数はありますか?

4

11 に答える 11

123

配列内の要素を検索するには、array_searchfunctionを使用でき、配列から要素を削除するには、functionを使用できunsetます。元:

<?php
$hackers = array ('Alan Kay', 'Peter Norvig', 'Linus Trovalds', 'Larry Page');

print_r($hackers);

// Search
$pos = array_search('Linus Trovalds', $hackers);

echo 'Linus Trovalds found at: ' . $pos;

// Remove from array
unset($hackers[$pos]);

print_r($hackers);

アレイ関連のその他の関数については、 https://www.php.net/manual/en/ref.array.phpを参照してください。

于 2010-06-17T06:53:21.807 に答える
117
<?php
$my_array = array('sheldon', 'leonard', 'howard', 'penny');
$to_remove = array('howard');
$result = array_diff($my_array, $to_remove);
?>
于 2013-09-10T21:50:46.570 に答える
17

最初に配列のキーを見つける必要があります。これはarray_search()を使用して行うことができます。

完了したら、unset()を使用します

<?php
$array = array( 'apple', 'orange', 'pear' );

unset( $array[array_search( 'orange', $array )] );
?>
于 2010-06-17T06:36:10.377 に答える
10

上記のコードのいずれかを使用する場合に備えてarray_search、「haystack」に「needle」が見つからない場合はFALSEが返されるため、これらのサンプルは最初の(ゼロインデックスの)項目の設定を解除することに注意してください。代わりにこれを使用してください:

<?php
$haystack = Array('one', 'two', 'three');
if (($key = array_search('four', $haystack)) !== FALSE) {
  unset($haystack[$key]);
}
var_dump($haystack);

上記の例では、次のように出力されます。

Array
(
    [0] => one
    [1] => two
    [2] => three
)

そして、それは良いことです!

于 2012-07-05T20:51:55.813 に答える
5

を使用array_filterして、コールバック関数に基づいて配列の要素を除外できます。コールバック関数は配列の各要素を引数として取り、falseその要素を削除する必要があるかどうかを返すだけです。これには、配列全体をスキャンするため、重複する値を削除できるという利点もあります。

次のように使用できます。

$myArray = array('apple', 'orange', 'banana', 'plum', 'banana');
$output = array_filter($myArray, function($value) { return $value !== 'banana'; });
// content of $output after previous line:
// $output = array('apple', 'orange', 'plum');

array_valuesまた、配列のインデックスを再作成する場合は、次のように結果を渡すことができます。

$output = array_values($output);
于 2017-01-06T19:11:15.867 に答える
4

このソリューションは、複数のオカレンスを削除するための@Peterのソリューションと、最初のオカレンスを削除するための@chynoソリューションを組み合わせたものです。それが私が使っているものです。

/**
 * @param array $haystack
 * @param mixed $value
 * @param bool $only_first
 * @return array
 */
function array_remove_values(array $haystack, $needle = null, $only_first = false)
{
    if (!is_bool($only_first)) { throw new Exception("The parameter 'only_first' must have type boolean."); }
    if (empty($haystack)) { return $haystack; }

    if ($only_first) { // remove the first found value
        if (($pos = array_search($needle, $haystack)) !== false) {
            unset($haystack[$pos]);
        }
    } else { // remove all occurences of 'needle'
        $haystack = array_diff($haystack, array($needle));
    }

    return $haystack;
}

こちらもご覧ください:PHP配列を値で削除(キーではありません)

于 2014-09-08T15:20:32.780 に答える
2

値に関係なく、配列から最初のunset array_search要素を誤って削除する可能性があるため、にはかなりひどい副作用があります。

        // bad side effects
        $a = [0,1,2,3,4,5];
        unset($a[array_search(3, $a)]);
        unset($a[array_search(6, $a)]);
        $this->log_json($a);
        // result: [1,2,4,5]
        // what? where is 0?
        // it was removed because false is interpreted as 0

        // goodness
        $b = [0,1,2,3,4,5];
        $b = array_diff($b, [3,6]);
        $this->log_json($b);
        // result: [0,1,2,4,5]

array_diff値が配列内にあることが保証されていることがわかっている場合は、それを選択してください。ただし、はるかに安全だと思います。(私はphp7を使用しています)

于 2020-07-07T15:45:18.013 に答える
1

まず、他の人が述べたように、以下に示すように、「 array_search()」および「unset() 」メソッドを使用します。

<?php
$arrayDummy = array( 'aaaa', 'bbbb', 'cccc', 'dddd', 'eeee', 'ffff', 'gggg' );
unset( $arrayDummy[array_search( 'dddd', $arrayDummy )] ); // Index 3 is getting unset here.
print_r( $arrayDummy ); // This will show the indexes as 0, 1, 2, 4, 5, 6.
?>

ここで、配列値を並べ替えずに同じ配列のインデックスを再作成するには、以下に示すように「 array_values() 」メソッドを使用する必要があります。

<?php
$arrayDummy = array_values( $arrayDummy );
print_r( $arrayDummy ); // Now, you will see the indexes as 0, 1, 2, 3, 4, 5.
?>

それが役に立てば幸い。

于 2010-07-08T07:06:41.437 に答える
1
$data_arr = array('hello', 'developer', 'laravel' );


// We Have to remove Value "hello" from the array
// Check if the value is exists in the array

if (array_search('hello', $data_arr ) !== false) {
     
     $key = array_search('hello', $data_arr );
     
     unset( $data_arr[$key] );
}



# output:
// It will Return unsorted Indexed array
print( $data_arr )


// To Sort Array index use this
$data_arr = array_values( $data_arr );


// Now the array key is sorted
于 2020-12-03T06:11:19.910 に答える
0

さて、これは少し長いですが、いくつかのクールなことをします。

メールのリストをフィルタリングしようとしましたが、特定のドメインとメールを除外しました。

以下のスクリプトは...

  1. 特定のドメインのレコードを削除する
  2. 正確な値のメールをすべて削除します。

最初に電子メールのリストを含む配列が必要です。次に、特定のドメインまたは個々の電子メールアカウントを除外リストに追加できます。

次に、最後にクリーンレコードのリストを出力します。

//list of domains to exclude
$excluded_domains = array(
    "domain1.com",
);

//list of emails to exclude
$excluded_emails = array(
    "bob@domain2.com",
    "joe@domain3.com",    
);

function get_domain($email) {

    $domain = explode("@", $email);
    $domain = $domain[1];
    return $domain;

}

//loop through list of emails
foreach($emails as $email) {

    //set false flag
    $exclude = false;

    //extract the domain from the email     
    $domain = get_domain($email);

    //check if the domain is in the exclude domains list
    if(in_array($domain, $excluded_domains)){
        $exclude = true;
    }

    //check if the domain is in the exclude emails list
    if(in_array($email, $excluded_emails)){
        $exclude = true;
    } 

    //if its not excluded add it to the final array
    if($exclude == false) {
        $clean_email_list[] = $email;
    }

    $count = $count + 1;
}

print_r($clean_email_list);
于 2019-10-28T20:38:27.610 に答える
-1

配列内の値の複数のインスタンスを見つけて削除するために、私は以下のコードを使用しました

$list = array(1,3,4,1,3,1,5,8);

$new_arr=array();

foreach($list as $value){

    if($value=='1')
    {
        continue;
    }
    else
    {
        $new_arr[]=$value;
    }     
}


print_r($new_arr);
于 2014-04-07T06:01:22.710 に答える