2013-03-11 11 views
5

Ho array in PHP e ho problemi con la rimozione di alcuni elementi da questo array. Ecco come si presenta:PHP Come eliminare l'elemento dall'array - array_uniqe non funzionerà

Array 
(
    [0] => 2x 633130A 
    [1] => 2x 525130B 
    [2] => 2x 591130B 
    [3] => 2x 963130B 
    [4] => 2x 813130B (20mm) 
    [5] => 2x 813130B 
    [6] => 2x 313130B (12mm) 
    [7] => 2x 313130B 
    [8] => 4x 413130B 
    [9] => 2x 633130B 
    [12] => 2x 381130A (23mm) 
    [13] => 2x 381130A 
) 

E ora vorrei per rimuovere questi elementi ripetuti senza mm parametro come potete vedere qui sotto:

FROM    =====>    TO   

Array         Array 
(          (
    [0] => 2x 633130A     [0] => 2x 633130A  
    [1] => 2x 525130B     [1] => 2x 525130B 
    [2] => 2x 591130B     [2] => 2x 591130B 
    [3] => 2x 963130B     [3] => 2x 963130B 
    [4] => 2x 813130B (20mm)   [4] => 2x 813130B (20mm) 
    [5] => 2x 813130B <= REMOVE   [5] => 2x 313130B (12mm) 
    [6] => 2x 313130B (12mm)   [6] => 4x 413130B 
    [7] => 2x 313130B <= REMOVE   [7] => 2x 633130B 
    [8] => 4x 413130B     [8] => 2x 381130A (23mm) 
    [9] => 2x 633130B     )  
    [12] => 2x 381130A (23mm)     
    [13] => 2x 381130A <= REMOVE 
) 

ho provato array_unique non funziona in questo caso, perché gli elementi non sono esattamente gli stessi. Qualcuno può aiutarmi a eliminare quegli elementi ripetuti?

+0

mi piacerebbe andare con l'ordinamento e poi in bicicletta sugli elementi. Il controllo è elemento 'n + 1' ha" mm "in esso ed elimina l'elemento' n' –

+0

Posso prontamente una soluzione rapida, forse non è la migliore, ma. 'array_search ('mm)', $ array)' per tutte le chiavi, prendi questi valori, 'substr' li al valore necessario 2x 813130B (20mm) -> 2x 813130B; dopo di esso 'array_search' questi valori e li unisci. Penso che possa essere migliorato. –

+2

Sarebbe bello se si fornisse l'array come codice PHP per semplificare la copia e l'incolla. – MichaelRushton

risposta

2

Questo farà ciò che è necessario in questo caso:

foreach ($array as $value) 
    { 

    if (FALSE !== strpos($value, '(')) 
    { 

     $string = trim(strtok($value, '(')); 

     while (FALSE !== $key = array_search($string, $array)) 
     { 
     unset($array[$key]); 
     } 

    } 

    } 

Sarà iterare sopra la matrice, a trovare nessuna elementi che hanno un ( come parte della stringa, trovare tutti gli elementi con una stringa che corrisponde fino allo ( (con spazio bianco extra tagliato), quindi rimuoverli se lo trova.

+0

hehe [Condizioni Yoda] (http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html) – Chad

+0

Impedisce quegli orribili errori di tipo if ($ x = 1) {'. ;) – MichaelRushton

+0

Ci scusiamo per un lungo ritardo, ma inizio a sviluppare il tuo codice immediatamente. Funziona perfettamente. Grazie a te per una risposta più rapida e per tutti. – Marcos

1
$initialData = array(
    '2x 633130A', 
    '2x 525130B', 
    '2x 591130B', 
    '2x 963130B', 
    '2x 813130B (20mm)', 
    '2x 813130B', 
    '2x 313130B (12mm)', 
    '2x 313130B', 
    '4x 413130B', 
    '2x 633130B', 
    '2x 381130A (23mm)', 
    '2x 381130A', 
); 

$filteredArray = array_filter(
    $initialData, 
    function($value) use ($initialData) { 
     if (strpos($value, 'mm') === FALSE) { 
      foreach($initialData as $testData) { 
       if (strlen($testData) > strlen($value) && 
        substr($testData,0,strlen($value)) == $value) { 
        return FALSE; 
       } 
      } 
     } 
     return TRUE; 
    } 
); 

var_dump($filteredArray); 
1

ho scritto una funzione personalizzata utilizzando preg_match()

$array = array 
(
    0 => '2x 633130A', 
    1 => '2x 525130B', 
    2 => '2x 591130B', 
    3 => '2x 963130B', 
    4 => '2x 813130B (20mm)', 
    5 => '2x 813130B', 
    6 => '2x 313130B (12mm)', 
    7 => '2x 313130B', 
    8 => '4x 413130B', 
    9 => '2x 633130B', 
    12 => '2x 381130A (23mm)', 
    13 => '2x 381130A' 
); 

$results = array(); 
foreach($array as $element){ 
    if(!custom_exists($array, $element)){ 
     $results[] = $element; 
    } 
} 

print_r($results); 

function custom_exists($array, $val){ 
    foreach($array as $element){ 
     if($element != $val && preg_match("/$val/", $element)){ 
      return true; 
     } 
    } 
    return false; 
} 
+1

Bello. Mi piace. – MichaelRushton

+0

@MichaelRushton thx :) – HamZa

Problemi correlati