如何过滤这个php数组

时间:2011-05-19 02:40:20

标签: php arrays filter

我有一个数组:

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'elment包含相同的字符串([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'
    )
);

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

3 个答案:

答案 0 :(得分:0)

如果您认为您的条件是替代条件,那么如果通过以下条件之一,则只能使用符合特定条件的所有值中的一个:

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

如果是这样,您可以使用一些索引数组来存储已经找到的'type'和'title'变量,并且:

  1. 添加一个变量,
  2. 检查下一个变量:
    • 已在索引表中添加'type',
    • 索引中已有'title',
    • 包含在已在索引中定义的“title”中,或包含已在index
    • 中定义的“title”
  3. 如果2.表示至少满足其中一个条件,请不要将其添加到结果中,否则添加它,
  4. 转到第2点。
  5. 在回报中,您应该收到您所描述的内容。只需用PHP编写。

答案 1 :(得分:0)

这样的事情应该做:

$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;
}

答案 2 :(得分:0)

如果数组保存在变量$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。如果找到,请将先前过滤的数组与重复之前和之后的所有元素合并。