2017-01-08 9 views
3

私はtimesとidsを持つ配列を持っていて、新しいidを付け加えています。例。配列の別の配列に類似の配列が存在するかどうかをチェックする方法

最初の配列

$times = array(
    array('start'=>"1:00","end"=>"1:59","id"=>1), 
    array('start'=>"2:00","end"=>"2:59","id"=>1), 
    array('start'=>"3:00","end"=>"3:59","id"=>1), 
    array('start'=>"4:00","end"=>"4:59","id"=>1), 
    array('start'=>"5:00","end"=>"5:59","id"=>1), 
    array('start'=>"6:00","end"=>"6:59","id"=>1) 
); 

$time = array('start'=>"2:00","end"=>"2:59","id"=>2); 
if(!in_array($time,$times){ // here is the problem 
    array_push($times,$time); 
} 

これは、/キーの同じペアを持っていることについてのその常に同じ以来、そのないペアのキー/値については重複しないを行う必要がありますIDの値に関係なく新しい要素が既に配列内に存在するかどうかを確認する

答えて

3

キーが異なるため、arrを使用することはできません比較関数と演算子を直接比較します。私は単純に配列を反復してキーを比較し推薦する:

$found = false; 
foreach ($times as $key => $t) { 
    if ($t['start'] == $x['start'] && $t['end'] == $x['end']) { 
    $found = true; 
    $times[$key] = $x; 
    break; 
    } 
} 

if (!$found) { 
    $times[] = $x; 
} 

フィールドの数が大きい、あるいは不明な場合は、設定を解除idフィールドでの一時的な配列を作成し、比較演算子とそれらを比較することができます。

+0

これは実際に問題を解決しますが、ここで$ timeは単なる例であり、$ timesを取得して新しい時刻を追加するために入れ子にしていますそれはCPU上の余分な負荷を意味する... しかし、私はそれを修正するので、私は解決策を受け入れるだろうt:D –

+1

@ YamenImadNassif、hmm。アイテムの数が多い場合は、[バイナリ検索](https://en.wikipedia.org/wiki/Binary_search_algorithm)など、より効率的な検索アルゴリズムが必要です。また、メモリベースのデータベース(たとえば、Redis、またはMEMORYエンジンのMySQLテーブル)を使用することもできます。 –

+0

私は速いものを必要とし、より効率的なものを置くので、私は瞬間の解決策をとるでしょう - 私が見つけた場合 - 後で ありがとう。 –

関連する問題