2017-01-18 5 views
0

特定の値を持つ配列からすべての項目を削除しようとしています。たとえば:PHP - 定義された値を持つ項目の後に配列からすべての項目を削除する

$breakers = ('a','b','c'); 
$array1 = ('z','z','a','b','c','z','z''z'); 
$array2 = ('z','b','z','z','z''z'); 
$array3 = ('z','c','z','a','z','z'); 
$array4 = ('z','z','z'); 

私は「A」、「B」または「C」だけ「A」、「B」または「C」の最後のインスタンスの後に「Z」の出現をすべて削除したいです出力は次のようになりますので、配列に発生します。

if (count((array_intersect($breakers, $array1)))>0) { ... } 

しかしI:

$array1 = ('z','z','a','b','c'); 
$array2 = ('z','b'); 
$array3 = ('z','c','z','a'); 
$array4 = ('z','z','z'); 

私は$ブレーカーは、(例えば)を持つ配列で発生したかどうかを確認することができるという限り持っていますどのようにして「何かの最後の出現後に発生するすべての 'z'値を削除する

+0

は、最後の出現位置を取得し、配列のサイズに到達するまで、その時点から削除します。値がzでなければ削除を停止したい場合は、最後の出現後のすべての値をチェックし、それを削除するか維持するかを決める必要があります。 – Nico

+0

カウンタ付きのforループを使用しないのはなぜですか?あなたのブレーカの出現を見つけると、あなたのカウントはあなたのブレーカアレイのインデックスとして役立ちます。あなたのカウントがあなたのブレーカーのサイズよりも高い場合は、次の "z" –

答えて

0

$ブレーカーの値は、このコードは、フラグと

<?php 
$breakers = ('1','2','3'); 
$array1 = ('z','z','a','b','c','z','z''z'); 
$lengthb = count($breakers); 
$match = 0; 
$count = 0; 
flag=0; 
foreach($array1 as $val) 
{ 

    if($val == $lenghtb[$match]) 
    { 
     $match++; 
    } 
    if($match == $lengthb) 
    { 
     flag = 1; 
     break; 
    } 
$count++; 


} 

if(flag == 1) 
{ 
array_slice($array1,0,$count+1,true); 
} 

?> 
0

ユーザーarray_filterを動作するはずです、そしてあなたは、各フィルタの前にフラグをリセットする必要があります。

<?php 
$breakers = array('a','b','c'); 
$array1 = array('z','z','a','b','c','z','z','z'); 
$flag = false; 
var_dump(array_filter($array1, function($v)use(&$flag, $breakers){ 
    if($flag) 
     return false; 
    if(in_array($v, $breakers)) 
    { 
     $flag = true; 
     return false; 
    } 
    return true; 

})); 

結果:

[email protected]:~$ php test.php 
array(2) { 
    [0]=> 
    string(1) "z" 
    [1]=> 
    string(1) "z" 
}