Как отфильтровать этот массив php - PullRequest
2 голосов
/ 19 мая 2011

У меня есть массив:

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'
    )
);

Как это отфильтровать, я так запутался. Спасибо.

Ответы [ 3 ]

0 голосов
/ 19 мая 2011

Примерно так должно поступить:

$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;
}
0 голосов
/ 19 мая 2011

Если массив содержится в переменной $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. Если найдено, объедините предыдущий отфильтрованный массив со всеми элементами до и после дубликата.

0 голосов
/ 19 мая 2011

Если вы рассматриваете ваши условия в качестве альтернативы, то при выполнении одного из следующих критериев можно использовать только одно из всех значений, соответствующих определенным критериям:

  • элемент 'type' равен,
  • элементы title в каждом массиве второго уровня одинаковы ([2] и [5]), или
  • один элемент title содержит другой ([0] и [3]]),

Если это так, вы можете просто использовать некоторые индексные массивы для хранения уже найденных переменных 'type' и 'title' и:

  1. добавить одну переменную,
  2. проверить, есть ли следующая переменная:
    • имеет «тип» уже в индексной таблице,
    • имеет «заголовок» уже в индексе,
    • содержитсяв 'title', уже определенном в индексе, или содержит 'title', уже определенном в индексе,
  3. , если 2. показывает, что хотя бы один из критериев удовлетворен, не добавляйте его врезультат, иначе добавьте его,
  4. перейдите к пункту 2.

В ответ вы получите то, что вы описалиредакторПросто напишите это на PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...