2017-09-15 19 views
-1

私はmongoDBから質問した要素の配列を持っています。配列をループして反復しない値を取得

この配列は、デバイスのIDとこのデバイスの消費の値を持ちます。

たとえば、3つの異なるID - > 18,5,3および複数の混合値があります。

// first record of 18 so get value. 
$row[0]["id"] = 18; 
$row[0]["value"] = 100; 

// not first record of 18 so ignore and move to the next record 
$row[1]["id"] = 18; 
$row[1]["value"] = 40; 

// first record of 5 so get value. 
$row[2]["id"] = 5; 
$row[2]["value"] = 20; 

// not first record of 18 so ignore and move to the next record 
$row[3]["id"] = 18; 
$row[3]["value"] = 30; 

// first record of 3 so get value. 
$row[4]["id"] = 3; 
$row[4]["value"] = 20; 

//not first record of 5 so ignore and move to the next record** 
$row[5]["id"] = 5; 
$row[5]["value"] = 30; 

// not first record of 18 so ignore and move to the next record 
$row[6]["id"] = 18; 
$row[6]["value"] = 10; 


... 
.... 

私がしようとしているのは、この$ row配列をループして、idの最新の値を取得することです。私は返すようにしたいものを上記の例では例えば

は次のとおりです。

id value 
18 100 
5  20 
3  20 

どのように私は、ロジックのようなものを行うことができますか?

+0

だから... ...ループ...ループはどこですか? – Dekel

+0

あなたはそれを試しましたか? – Emaro

+0

5の最初のレコードは20ですが、戻り値に40を入れます。なぜですか? –

答えて

1

を実行します。最も簡単な1が使用することですforeach

$result = array(); 
foreach ($row as $i) { 
    if (! array_key_exists($i['id'], $result)) { 
     $result[$i['id']] = $i['value']; 
    } 
} 

# Verify the result 
print_r($result); 

出力は次のようになります。

Array 
(
    [18] => 100 
    [5] => 20 
    [3] => 20 
) 

も同様の処理が、array_reduce()使用して:あなたがしようとしている場合

$result = array_reduce(
    $row, 
    function(array $c, array $i) { 
     if (! array_key_exists($i['id'], $c)) { 
      $c[$i['id']] = $i['value']; 
     } 
     return $c; 
    }, 
    array() 
); 
0

array_unique()関数は、まさにあなたが見ているものです。 こちらのドキュメントを参照してください:array_unique() documentation

+1

あなたはフランス語のサイトにリンクしています。英語はhttp://php.net/manual/en/functionです。array-unique.php – Emaro

+1

私は注意を払わなかった、私はリンクを修正しました、ありがとう:) –

1

をインデックスキーで、この

$alreadyfound = []; // empty array 
$result = []; 
foreach ($row as $item) 
{ 
    if (in_array($item["id"], $alreadyfound)) 
     continue; 
    $alreadyfound[] = $item["id"]; // add to array 
    $result[] = $item; 
} 

結果

array_columnを使用して
Array 
(
    [0] => Array 
     (
      [id] => 18 
      [value] => 100 
     ) 

    [1] => Array 
     (
      [id] => 5 
      [value] => 20 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [value] => 20 
     ) 

) 
0

を試してみてくださいするので、ほとんどそれを行いますが、それは逆の順番になります入力を元に戻すことができます。

$result = array_column(array_reverse($row), 'value', 'id'); 
1

あなたがそれぞれ「ID」の最初のオカレンスだけを残しておきたい場合は、単に集計配列に値を追加する - しかし、彼らはすでに追加されていない場合に限ります。次に、集約配列の値を取得します。

https://tehplayground.com/NRvw9uJF615oeh6C - Ctrlキーを押しながらそれはいくつかの方法で行うことができます


$results = array(); 
foreach ($row as $r) { 
    $id = $r['id']; 
    if (! array_key_exists($id, $results)) { 
     $results[$id] = $r; 
    } 
} 

$results = array_values($results); 
print_r($results); 

Array 
(
    [0] => Array 
     (
      [id] => 18 
      [value] => 100 
     ) 

    [1] => Array 
     (
      [id] => 5 
      [value] => 20 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [value] => 20 
     ) 

) 
関連する問題