0

我想删除数组上的一些重复值,但有一个条件是脚本必须忽略包含特定单词的数组。

以下代码改编自PHP: in_array

$array = array( 'STK0000100001',
                'STK0000100002',
                'STK0000100001',           //--> This should be remove
                'STK0000100001-XXXX',      //--> This should be ignored
                'STK0000100001-XXXX' );    //--> This should be ignored

$ignore_values = array('-XXXX');

if(make_unique($array, $ignore_values) > 0) {
    //ERROR HERE
}

使数组唯一的函数是:

function make_unique($array, $ignore) {
    $i = 0;
    while($values = each($array))  {
        if(!in_array($values[1], $ignore)) {
            $dupes = array_keys($array, $values[1]);
            unset($dupes[0]);
            foreach($dupes as $rmv) {
                $i++;
            }            
        }
    }
    return $i;
}

我尝试过使用if(!in_array(str_split($values[1]), $ignore)) ...,但它是一样的。

数组应该变成这样:

STK0000100001
STK0000100002
STK0000100001-XXXX
STK0000100001-XXXX

怎么做?

4

2 回答 2

1

这应该适用于>= PHP 5.3.

$res = array_reduce($array, function ($res, $val) use ($ignore_values) { 
    $can_ignore = false;
    foreach ($ignore_values as $ignore_val) {
      if (substr($val, 0 - strlen($ignore_val)) == $ignore_val) {
        $can_ignore = true;
        break;
      }
    }

    if ( $can_ignore || ! in_array($val, $res)) {
      $res[] = $val;
    }
    return $res;

  }, array()
);

否则

$num_of_duplicates = 0;
$res = array();
foreach ($array as $val) { 
  $can_ignore = false;
  foreach ($ignore_values as $ignore_val) {
    if (substr($val, 0 - strlen($ignore_val)) == $ignore_val) {
      $num_of_duplicates++;
      $can_ignore = true;
      break;
    }
  }
  if ( $can_ignore || ! in_array($val, $res)) {
    $res[] = $val;
  }
}

编辑:添加duplicate count到第二个片段。

于 2012-11-09T05:18:58.290 回答
1

试试这个,print_r();在生产中使用时去掉里面的函数

if(make_unique($array, $ignore_values) > 0) {
    //ERROR HERE
}

function make_unique($array, $ignore)  {
    $array_hold = $array;
    $ignore_val = array();
    $i = 0;
    foreach($array as $arr) {
        foreach($ignore as $ign) {
            if(strpos($arr, $ign)) { 
                 array_push( $ignore_val, $arr);
                 unset($array_hold[$i]);
                 break;
            }
        }
        $i++;
    }
    $unique_one = (array_unique($array_hold));
    $unique_one = array_merge($unique_one,$ignore_val);
    print_r($unique_one);

    return count($array) - count($unique_one);
}
于 2012-11-09T05:07:12.493 回答