Массив почти уникальных критериев - PullRequest
1 голос
/ 21 февраля 2012

Как правильно сделать такой массив, чтобы он был уникальным? (и под уникальным я подразумеваю, что удаляется только массив [3], поскольку он является дубликатом массива [2])

array(
 array( "Title", 50, 96 ),
 array( "Other Title", 110, 225 ),
 array( "Title", 110, 225 ),
 array( "Title", 110, 225 ),
)

Единственный массив, который я хочу в этом случае отфильтровать, - это последний (в данном случае), но особого порядка нет, и ручной труд его не урезает. (выскочив на целевую позицию). Это довольно большой массив, мне нужно думать и о производительности.

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

array(
 array( "Title" => array( 50, 96 ), array(110, 225) )
 array( "Other Title", array( 110, 225 ) )
)

Но на этот раз это не поможет моему делу.

В массиве нет уникального значения (только), но комбинация значений для каждого массива второго уровня уникальна.

Ответы [ 4 ]

4 голосов
/ 21 февраля 2012

Попробуйте это .....

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
2 голосов
/ 21 февраля 2012

Конечно, кто-то победит меня с лучшим решением, но это простое. Все, что вы делаете, это «хэшируете» исходные массивы, объединяя все их элементы, затем отслеживая, какие из них были добавлены в набор уникальных входных данных. Вы добавляете исходный массив только в том случае, если его «хэшированные» (объединенные значения) еще не добавлены в хеш-массив.

$aMain = array(
 array( "Title", 50, 96 ),
 array( "Other Title", 110, 225 ),
 array( "Title", 110, 225 ),
 array( "Title", 110, 225 ),
);

$_aHashed = array();
$aUniqued = array();
foreach($aMain as $aUnhashed) {
    $sHash = implode('', $aUnhashed);
    if(!in_array($sHash, $_aHashed)) {
        $_aHashed[] = $sHash;
        $aUniqued[] = $aUnhashed;
    }
}

var_dump($aUniqued);
1 голос
/ 21 февраля 2012
$array = array(array("Title", 50, 96), array("Other Title", 110, 225), array("Title", 110, 225), array("Title", 110, 225));

function remove_duplicates_multi_array($array) {

    $serialized_arrays = array();
    // serialize every array
    foreach ($array as $key=>$value) {
        $serialized_arrays[$key] = serialize($value);
    }
    // use array_unique to remove duplicates
    $unique_array = array_unique($serialized_arrays);

    $multi_unique = array();

    //unserialize every item inside the array
    foreach($unique_array as $key=>$value) {
        $multi_unique[$key] = unserialize($value);
    }

    return $multi_unique;
}

var_dump(remove_duplicates_multi_array($array));
1 голос
/ 21 февраля 2012
$filtered = array();
foreach ($array as $entry) {
    $hash = md5(serialize($entry));
    $filtered[$hash] = $entry;
}

Вы даже можете отключить md5, чтобы ускорить процесс.

...