PHP如何从数组中删除元素-使用array_unique无法解决问题。

5

我有一个PHP数组,需要从中删除一些元素,但我遇到了问题。它看起来像这样:

Array
(
    [0] => 2x 633130A
    [1] => 2x 525130B
    [2] => 2x 591130B
    [3] => 2x 963130B
    [4] => 2x 813130B (20mm)
    [5] => 2x 813130B
    [6] => 2x 313130B (12mm)
    [7] => 2x 313130B
    [8] => 4x 413130B
    [9] => 2x 633130B
    [12] => 2x 381130A (23mm)
    [13] => 2x 381130A
)

现在我想删除这些重复的元素,不带mm参数,如下所示:

    FROM                =====>              TO          

Array                                   Array
(                                       (
    [0] => 2x 633130A                   [0] => 2x 633130A       
    [1] => 2x 525130B                   [1] => 2x 525130B
    [2] => 2x 591130B                   [2] => 2x 591130B
    [3] => 2x 963130B                   [3] => 2x 963130B
    [4] => 2x 813130B (20mm)            [4] => 2x 813130B (20mm)
    [5] => 2x 813130B <= REMOVE         [5] => 2x 313130B (12mm)
    [6] => 2x 313130B (12mm)            [6] => 4x 413130B
    [7] => 2x 313130B <= REMOVE         [7] => 2x 633130B
    [8] => 4x 413130B                   [8] => 2x 381130A (23mm)
    [9] => 2x 633130B                   )       
    [12] => 2x 381130A (23mm)                   
    [13] => 2x 381130A <= REMOVE
)

我尝试使用array_unique,但在这种情况下无效,因为元素并不完全相同。有人能帮助我如何删除重复的元素吗?


我会选择先进行排序,然后遍历元素。检查元素 n+1 是否包含 "mm" 并删除项 n - Bart Friederichs
我可以提供快速解决方案,也许不是最好的,但是。对于所有键,使用 array_search('mm)', $array) 获取这些值,将它们 substr 到所需的值 2x 813130B (20mm) -> 2x 813130B;然后 array_search 这些值并将其取消设置。我认为它可以改进。 - Viacheslav Kondratiuk
2
如果您能提供数组的PHP代码,那将非常好,这样我们就可以轻松地复制和粘贴。 - Michael
3个回答

2
在这种情况下,以下代码可以满足您的需求:
  foreach ($array as $value)
  {

    if (FALSE !== strpos($value, '('))
    {

      $string = trim(strtok($value, '('));

      while (FALSE !== $key = array_search($string, $array))
      {
        unset($array[$key]);
      }

    }

  }

此代码将遍历数组,查找任何包含字符串(的元素,查找任何字符串匹配到((额外的空格已被削减)的元素,如果找到,则将其删除。


Yoda Conditions:Yoda条件 - Chad
防止那些可怕的 if ($x = 1) { 打字错误。 ;) - Michael
抱歉让您久等了,但我立即开始开发您的代码。它完美地运行了。感谢您的快速回复和大家的支持。 - Marcos

1
$initialData = array(
    '2x 633130A',
    '2x 525130B',
    '2x 591130B',
    '2x 963130B',
    '2x 813130B (20mm)',
    '2x 813130B',
    '2x 313130B (12mm)',
    '2x 313130B',
    '4x 413130B',
    '2x 633130B',
    '2x 381130A (23mm)',
    '2x 381130A',
);

$filteredArray = array_filter(
    $initialData,
    function($value) use ($initialData) {
        if (strpos($value, 'mm') === FALSE) {
            foreach($initialData as $testData) {
                if (strlen($testData) > strlen($value) && 
                    substr($testData,0,strlen($value)) == $value) {
                    return FALSE;
                }
            }
        }
        return TRUE;
    }
);

var_dump($filteredArray);

1
我使用 preg_match() 编写了一个自定义函数。
$array = array
(
    0 => '2x 633130A',
    1 => '2x 525130B',
    2 => '2x 591130B',
    3 => '2x 963130B',
    4 => '2x 813130B (20mm)',
    5 => '2x 813130B',
    6 => '2x 313130B (12mm)',
    7 => '2x 313130B',
    8 => '4x 413130B',
    9 => '2x 633130B',
    12 => '2x 381130A (23mm)',
    13 => '2x 381130A'
);

$results = array();
foreach($array as $element){
    if(!custom_exists($array, $element)){
        $results[] = $element;
    }
}

print_r($results);

function custom_exists($array, $val){
    foreach($array as $element){
        if($element != $val && preg_match("/$val/", $element)){
            return true;
        }
    }
    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接