2015-04-02 3 views
1

Я пытаюсь изменить значения массива, если одно из значений несколько раз и изменит на null дублирующиеся значения за исключением первого.PHP - многомерный массив - если такое же значение в массиве, измените все значения, кроме первого

У меня есть этот массив: массив $ =

array (size=6) 
    0 => 
    array (size=3) 
     'id' => int 1 
     'data-time-start' => int 0 
     'data-time-end' => int 5 
    1 => 
    array (size=3) 
     'id' => int 2 
     'data-time-start' => int 6 
     'data-time-end' => int 10 
    2 => 
    array (size=3) 
     'id' => int 1 
     'data-time-start' => int 11 
     'data-time-end' => int 15 
    3 => 
    array (size=3) 
     'id' => int 3 
     'data-time-start' => int 16 
     'data-time-end' => int 20 
    4 => 
    array (size=3) 
     'id' => int 4 
     'data-time-start' => int 21 
     'data-time-end' => int 25 
    5 => 
    array (size=3) 
     'id' => int 3 
     'data-time-start' => int 30 
     'data-time-end' => int 35 
    6 => 
    array (size=3) 
     'id' => null 
     'data-time-start' => int 40 
     'data-time-end' => int 45 
    7 => 
    array (size=3) 
     'id' => int 3 
     'data-time-start' => int 45 
     'data-time-end' => int 60 

В этом примере я два раза 'id' = int 1 и трижды 'id' = int 3. То, что я хотел бы сделать, это сохранить первый идентификатор, но установить другие повторяющиеся идентификаторы NULL и возвращает массив так:

array (size=6) 
    0 => 
    array (size=3) 
     'id' => int 1 
     'data-time-start' => int 0 
     'data-time-end' => int 5 
    1 => 
    array (size=3) 
     'id' => int 2 
     'data-time-start' => int 6 
     'data-time-end' => int 10 
    2 => 
    array (size=3) 
     'id' => null 
     'data-time-start' => int 11 
     'data-time-end' => int 15 
    3 => 
    array (size=3) 
     'id' => int 3 
     'data-time-start' => int 16 
     'data-time-end' => int 20 
    4 => 
    array (size=3) 
     'id' => int 4 
     'data-time-start' => int 21 
     'data-time-end' => int 25 
    5 => 
    array (size=3) 
     'id' => null 
     'data-time-start' => int 30 
     'data-time-end' => int 35 
    6 => 
    array (size=3) 
     'id' => null 
     'data-time-start' => int 40 
     'data-time-end' => int 45 
    7 => 
    array (size=3) 
     'id' => null 
     'data-time-start' => int 45 
     'data-time-end' => int 60 

Пробовал с этим, но ничего не произошло ...

var_dump(setNulForDuplicatesInArray($array, 'id')) 

function setNulForDuplicatesInArray($arr, $keyToFind) 
    { 
     $newArr = array(); 
     for ($i = 0; $i < sizeof($arr); $i++) { 
      if (in_array($arr[$i], $newArr)) 
       $newArr[$i][$keyToFind] = null; 
      else 
       $newArr[] = $arr[$i]; 
     } 
     return $newArr; 
    } 

массива() ...

Спасибо!

ответ

1

Один из способов - создать еще один контейнер, который будет использоваться для проверки того, был ли уже установлен этот идентификатор. На каждой итерации вам нужно будет проверить это. Если он уже находится внутри контейнера, установите этот id равным null. Грубый пример:

$temp = array(); // temporary container 
foreach($array as &$a) { 
    if(!isset($temp[$a['id']])) { // if this id isn't here yet 
     $temp[$a['id']] = $a; // push it inside 
    } else { 
     $a['id'] = null; // if its already taken, set it to null 
    } 
} 

Sample Output

+0

Хорошо для explainations но ваша функция возвращает «нулевой» – Zagloo

+1

@Zagloo я не знаю, как вы используете это, но он отлично работает HTTP: //codepad.viper- 7.com/nQxABn – Ghost

+0

oh sorry ... Я помещаю ваш код в функцию и возвращаю $ temp вместо $ array ... Спасибо за все :) !! – Zagloo

Смежные вопросы