PHP - 如果相同则更改值,并且除第一个之外的数组中的多个

时间:2015-04-02 07:33:28

标签: php arrays

我正在尝试更改数组的值,如果其中一个值为几次,并且更改重复值将替换为第一个。

我有这个数组:

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' => int 3
      'data-time-start' => int 40
      'data-time-end' => int 45

在此示例中,我有两次'id' = int 1和三次'id' = int 3。 我想要做的是保留第一个ID,但将其他重复ID设置为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

我不是php的专家......

编辑1:

试着说:

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;
    }

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

但没有发生任何事情

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

function setNulForDuplicates($theArray) {
    $myarray = array();
    for ($ind = 0; $ind < count($theArray); $ind++) {
        if (in_array($theArray[$ind], $myarray)) {
            $myarray[$ind]['id'] = 'null';
        } else {
            $myarray[$ind] = $theArray[$ind];
        }
    }
    return $myarray;
}

var_dump(setNulForDuplicates($arr));

答案 1 :(得分:1)

这里有一个应该做的小功能:

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

它遍历数组并检查$newArr中是否已存在相同的条目。如果是,则id设置为null。如果没有,则该条目被推送到$newArr

请注意,在此示例中,null是一个字符串。我这样做是因为在您想要的结果中,null是一个字符串。如果不需要,只需删除周围的引号。

答案 2 :(得分:1)

$arr=array(
    array("id"=>1),
    array("id"=>2),
    array("id"=>1),
    array("id"=>3),
    array("id"=>4),
    array("id"=>3),
    array("id"=>3)
    );
var_dump($arr);
$tmp=array();
foreach($arr as $k =>$v){
    if(!in_array($v['id'], $tmp)){
        $tmp[]=$v['id'];
    }else{
        $arr[$k]['id']=null;
    }
}
var_dump($arr);