【问题标题】:How to filter this php array如何过滤这个php数组
【发布时间】:2011-08-28 12:49:03
【问题描述】:

我有一个数组:

Array(
    [0] => Array(
        ['title'] => 'Apple',
        ['type'] => '1'
    ),
    [1] => Array(
        ['title'] => 'Oranage',
        ['type'] => '2'
    ),
    [2] => Array(
        ['title'] => 'Tomato',
        ['type'] => '1'
    ),
    //when compares with [0], 'type' is equal and both contains 'Apple', remove.
    [3] => Array(
        ['title'] => 'Red Apple',
        ['type'] => '1'
    ),
    [4] => Array(
        ['title'] => 'Big Tomato',
        ['type'] => '3'
    ),
    //when compares with [1], 'type' is equal and both contains 'Oranage', remove.
    [5] => Array(
        ['title'] => 'Sweet Oranage',   
        ['type'] => '2'
    )
);

如果 'type' 元素相等,而 'title' 元素包含相同的字符串([0] 和 [3] 包含 'Apple'),则仅使用一个元素。 结果将是:

Array(
    [0] => Array(
        ['title'] => 'Apple',
        ['type'] => '1'
    ),
    [1] => Array(
        ['title'] => 'Oranage',
        ['type'] => '2'
    ),
    [2] => Array(
        ['title'] => 'Tomato',
        ['type'] => '1'
    ),
    [4] => Array(
        ['title'] => 'Big Tomato',
        ['type'] => '3'
    )
);

如何过滤这个,我很困惑。 谢谢。

【问题讨论】:

  • 我不太明白这个逻辑。 [2] 和 [5] 的相似之处以及标题的相同之处...?
  • 您说'title' element in each second level array are the same ([2] and [5]) - 但第二个元素的标题为Tomato,第五个元素的标题为Sweet Orange。你能澄清一下吗?
  • @deceze 我看到我们在理解 [2] 和 [5] 之间的相似性方面都有问题;)
  • 哦,对不起。我修改了那个。如果任一 'title' 元素包含相同的字符串,并且 'type' 元素相等。然后只剩下一个元素。

标签: php arrays filter


【解决方案1】:

如果您将您的条件视为替代条件,则如果满足以下条件之一,则只能使用满足特定条件的所有值之一:

  • 'type' 元素是相等的,
  • 每个二级数组中的“title”元素相同([2] 和 [5]),或者
  • 一个“标题”元素包含另一个([0] 和 [3]),

如果是这样,您可以只使用一些索引数组来存储已经找到的“类型”和“标题”变量,并且:

  1. 添加一个变量,
  2. 检查下一个变量是否:
    • 索引表中已有“类型”,
    • 索引中已有“title”,
    • 包含在索引中已定义的“标题”中或包含已在索引中定义的“标题”,
  3. 如果 2. 表明至少满足一个条件,则不要将其添加到结果中,否则添加它,
  4. 转到第 2 点。

在退货中,您应该会收到您所描述的内容。用 PHP 写就行了。

【讨论】:

    【解决方案2】:

    应该这样做:

    $array = array(/* your array */);
    $filteredArray = array();
    
    foreach ($array as $key => $elem) {
        foreach ($filteredArray as $comp) {
            if ($elem['type'] == $comp['type'] &&
                (strpos($elem['title'], $comp['title']) !== false || strpos($comp['title'], $elem['title']) !== false)
            ) {
                continue 2;  // skip to the next $elem
            }
        }
        $filteredArray[$key] = $elem;
    }
    

    【讨论】:

      【解决方案3】:

      如果数组保存在变量$ar中,那么:

      $filtered = Array();
      
      for(int $i = 0; $i < count($ar); $i++) {
        for(int $j = $i; $j < count($ar); $j++) {
          if($ar[$i][$type] == $ar[$i][$type]) {
            if(strlen($ar[$i][$title]) < strlen($ar[$j][$title])) {
              $larger = $j;
              $smaller = $i;
            }
            else {
              $larger = $i;
              $smaller = $j;
            }
            if(preg_match(strtolower($smaller), strtolower($larger)) {
              $filtered = array_merge($filtered, array_slice($ar, 0, $larger - 1), array_slice($ar, $larger, count($ar) - $larger));
            }
          }
        }
      }
      

      找到两个具有相同类型的元素。然后,获取具有最短标题的元素的标题,并在另一个元素中搜索preg_match。如果找到,则将先前过滤的数组与重复项之前和之后的所有元素合并。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 2021-03-28
        • 2011-11-03
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        相关资源
        最近更新 更多