检查数组元素是否已部分存在于数组内部

时间:2017-02-09 15:46:04

标签: php arrays

我有一个如下所示的数组:

[Amsterdam, Elderly people, Thousand students, Sixteen thousand students, Clean houses]

如您所见,有一个条目“thousand students”和一个条目“sixteen thousand students”。有没有办法让我过滤掉thousand students(并删除此条目),因为它已经部分存在了?

然而,手动取消设置元素将无法正常工作。该数组是API的结果,这意味着我不知道是否存在部分重复。

感谢。

编辑:预期结果:

[Amsterdam, Elderly people, Sixteen thousand students, Clean houses]

3 个答案:

答案 0 :(得分:2)

所以我试图在没有两个循环的情况下找到一个更流畅的方式,但是这样做会:

foreach($array as $k => $a) {
    foreach($array as $b) {
        if(strtolower($a) !== strtolower($b) &&
          (strpos(strtolower($b), strtolower($a)) !== false)) {
            unset($array[$k]);
        }
    }
}
  • 循环数组并将小写的每个值与小写的其他值进行比较
  • 如果它们不相等并且在另一个中找到一个,请使用该键删除在另一个中找到的那个

可能有点短:

foreach(array_map('strtolower', $array) as $k => $a) {
    foreach(array_map('strtolower', $array) as $b) {
        if($a !== $b && (strpos($b, $a) !== false)) {
            unset($array[$k]);
        }
    }
}

答案 1 :(得分:0)

试试这个:

qreal screenDpi = QApplication::desktop()->physicalDpiX() / 72.;

答案 2 :(得分:0)

这应该可以解决问题,但它只会在单词级别查找匹配项,并且区分大小写。

<?php
$wordsList = [
    'Amsterdam', 'Elderly people', 'Thousand students', 
    'Sixteen thousand students', 'Clean houses',
];

$lookup = array();
foreach ($wordsList as $k => $words) {
    $phrase = '';
    foreach (preg_split('`\s+`', $words, -1, PREG_SPLIT_NO_EMPTY) as $word) {
        $phrase .= $word;

        if (in_array($phrase, $words)) {
            unset($wordsList[$k]);
            break;
        }
    }
}