2016-03-01 2 views
0

У меня есть пример ассоциативного массива в php. Я хочу, чтобы одно из двух происходило из элемента. Первый и второй массивы comporte имя 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' и' unset() 'второй элемент, который содержит этот элемент. – 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) сравнивающий сохраненный с текущим в итерации, с любой логикой Comparation вы хотите реализовать.

0

Вы можете сравнить: name и unset() подмассива, который содержит этот элемент.

$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']); 
}); 
Смежные вопросы