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

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 に答える
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 count2番目のスニペットに追加されました。

于 2012-11-09T05:18:58.290 に答える