2016-03-01 23 views
0

我有一個php中的關聯數組的例子。我想保留一個元素的兩個元素之一。第一個和第二個數組稱讚Z,所以我想保留其中一個基於關鍵字(名稱)和特殊條件的分數。對我來說最重要的是知道如何去做。這是我做的一個嘗試,但我失敗了。如何保持關聯數組中的值

foreach($tabs as $key => $tab){ 
     if($tab[$key]['name'] != $tab[$key+1]['name']){ 

     //do some code 

    } 
} 

array(

     [0] => array(

       id => 1, 
       name => Z 
       score => 77 
     ) 

     [1] => array(

       id => 2, 
       name => Z 
       score => 10 
     ) 

     [2] => array(

       id => 3, 
       name => A 
       score => 55 
     ) 
); 

我想要保持這樣的數組:

array(

     [0] => array(

       id => 1, 
       name => Z 
       score => 77 
     ) 

     [2] => array(

       id => 3, 
       name => A 
       score => 55 
     ) 
); 

感謝

+0

您可以通過其中包含此元素'name'和'未設置()'第二個元素進行比較。 – mitkosoft

+0

什麼不適合你?你可以使用'unset($ tab [$ key])'。 http://php.net/manual/en/function.unset.php – martin

+0

我認爲他正在尋找一種方式來找到重複的價值,根據:「對我來說最重要的是要知道如何去做。」 –

回答

1

我會去這樣的事情:

<?php 
$original_data = array(
    0 => array(
     'id' => 1, 
     'name' => 'Z', 
     'score' => 77 
    ), 
    1 => array(
     'id' => 2, 
     'name' => 'Z', 
     'score' => 10 
    ), 
    2 => array(
     'id' => 3, 
     'name' => 'A', 
     'score' => 55 
    ) 
); 

$highest = array(); 

$to_be_removed = array(); 

foreach($original_data as $key => &$tab) 
{ 
    if(isset($highest[$tab['name']]['score'])) 
    { 
     if($tab['score'] > $highest[$tab['name']]['score']) 
     { 
      $to_be_removed[$highest[$tab['name']]['index']] = ''; 

      $highest[$tab['name']]['score'] = $tab['score']; 
      $highest[$tab['name']]['index'] = $key; 
     } 
     else 
     { 
      $to_be_removed[$key] = ''; 
     } 
    } 
    else 
    { 
     $highest[$tab['name']]['score'] = $tab['score']; 
     $highest[$tab['name']]['index'] = $key; 
    } 
} 

if($to_be_removed) 
{ 
    foreach($to_be_removed as $k=>&$v) 
    { 
     unset($original_data[$k]); 
    } 
} 

print_r($original_data); 
1

您可以使用in_array()找到它,但這個功能是不是遞歸的,所以你需要讓你的自己的功能,像這樣:

function in_array_r($needle, $haystack, $strict = false) { 
    foreach ($haystack as $item) { 
     if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) { 
      return true; 
     } 
    } 
    return false; 
} 

你可以像這樣使用它:

foreach($tabs as $key => $tab){ 
    if(in_array_r($tab['name'], $tabs){ 
     // it found in the whole array 
     unset($tabs[$key]); 
    } 
} 
1

你可以做

$new = []; 

foreach ($tabs as $tab) { 
    if (! isset($new[$tab['name']])) { 
     $new[$tab['name']] = $tab; 
    } 
} 

$new = array_values($new); 

這是一個2級的解決方案,具有以下優點:它沒有遍歷每個檢查整個陣列。

如果您需要檢查的覆蓋或沒有條件(分數值等),

foreach ($tabs as $tab) { 
    if ((! isset($new[$tab['name']])) 
     || shouldOverwrite($new[$tab['name'], $tab) 
    ) { 
     $new[$tab['name']] = $tab; 
    } 
} 

你應該定義function shouldOverwrite($old, $new)比較存儲與當前的迭代,任何比較 - 邏輯你希望執行。

0

您可以通過nameunset()比較包含此元素的子數組。

$arr = array(
    0 => array(
     id => 1, 
     name => Z, 
     score => 77 
    ), 
    1 => array(
     id => 2, 
     name => Z, 
     score => 10 
    ), 
    2 => array(
     id => 3, 
     name => A, 
     score => 55 
    ) 
); 
$name = ''; 
foreach($arr as $key=>$val){ 
    if($name == $val['name']){ 
     unset($arr[$key]); 
    }else{ 
     $name = $val['name'];     
    } 
} 
print_r($arr); 

輸出爲:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => Z 
      [score] => 77 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [name] => A 
      [score] => 55 
     ) 

) 
0

嘗試好醇」取消設置:

foreach($tabs as $key => $tab){ 
     if (isset($tab[$key-1] && $tab[$key]['name'] != $tab[$key-1]['name']){  
      //do some code 
     } elseif (isset($tab[$key-1])) && $tab[$key]['name'] == $tab[$key-1]['name']) { 
      unset($tab[$key-1]); 
     } 
    } 
} 

這隻會工作如果物品相鄰。如果他們不相鄰,你可以在陣列的第一排序,以確保它們是:

usort($tabs, function ($v1,$v2) { 
    return strcmp($v1['name'], $v2['name']); 
});