2009-08-09 12 views
1

ein Array mit n-Werten, zum Beispiel Gegeben:Ermittelt die Länge des Anfangssegment passende Maske auf Arrays

$arr[] = 'ABCDEFABC'; 
$arr[] = 'ABCDEFDEF'; 
$arr[] = 'ABCDEFGHI'; 
$arr[] = 'ABCDEFJKL'; 

wie kann ich das Anfangssegment finden, die alle Spiele (oder die meisten, im Beispiel unten) Werte, in diesem Fall ABCDEF?

EDIT 2: NICHT Gelöst, SIEHE ANTWORT.

Schlimmer noch, angesichts der folgenden Reihe:

$arr[] = 'ABCDEFABC'; 
$arr[] = 'ABCDEFDEF'; 
$arr[] = 'ABCDEFGHI'; 
$arr[] = 'ABCDEFJKL'; 
$arr[] = 'DEFABCABC'; 
$arr[] = 'DEFABCDEF'; 
$arr[] = 'DEFABCGHI'; 
$arr[] = 'DEFABCJKL'; 

wie kann ich:

$result[] = 'ABCDEF'; 
$result[] = 'DEFABC'; 

Dieser ist heikel ... Was ich versuche ist das Verhalten von strspn zu erreichen() (wo die Reihenfolge der "Maske" zählt, danke Zed) für Arrays angewendet.

BEARBEITEN: Um etwas aufzuklären, was ich will, ist die Suche nach allen gewöhnlichen Buchstaben, die im selben Index in allen Werten des Arrays existieren (nicht sicher, ob dies das Problem leichter gemacht hat oder nicht!). Da bei diesem zweiten Problem alle Zeichen nicht mit dem Index in den anderen Werten übereinstimmen, muss die maximale Anzahl identischer Anfangssegmente (in diesem Fall 2: ABCDEF und DEFABC) übereinstimmen.

+0

strspn() ist nicht das, was Sie suchen. strspn ("ABC", "CBA") = 3. – Zed

+0

Ja, du hast Recht ... Hier ist die Reihenfolge der Maske wichtig. Aber was ist wichtig, dass Sie den Punkt verstanden haben. –

Antwort

2

Wenn ich richtig verstehe, Sie versuchen, die Menge des längsten gemeinsamen Präfixes einen Satz Saiten gegeben zu bestimmen.

es nach unten, das gemeinsame Präfix zwischen zwei beliebigen Zeichenketten Brechen als

function longestCommonPrefix($str1, $str2) { 
    $minLen = min(strlen($str1), strlen($str2)); 
    for ($i = 0; $i < $minLen; $i++) { 
     if ($str1[$i] != $str2[$i]) { 
      return substr($str1, 0, $i); 
     } 
    } 
    return substr($str1, 0, $minLen); 
} 

Ein Weg gefunden werden der Satz von Präfixen bekommen könnte dann sein:

function longestCommonPrefixes($arr) { 
    sort($arr); 
    $prefixes = array(); 
    for ($i = 0; $i < count($arr); $i++) { 
     for ($j = $i+1; $j < count($arr); $j++) { 
      $prefix = longestCommonPrefix($arr[$i], $arr[$j]); 
      if ($prefix == "") break; 
      $prefixes[$prefix] = true; 
     } 
    } 
    return array_keys($prefixes); 
} 

Beachten Sie, dass die zurückgegebenen Präfixe können Präfixe voneinander sein. Das heißt, es ist möglich, dass das Ergebnis eine Menge von Strings enthält, wie zum Beispiel array('A', 'AA', 'AAA').

es Putting alles zusammen:

$arr = array(); 
$arr[] = 'ABCDEFABC'; 
$arr[] = 'ABCDEFDEF'; 
$arr[] = 'ABCDEFGHI'; 
$arr[] = 'ABCDEFJKL'; 
$arr[] = 'DEFABCABC'; 
$arr[] = 'DEFABCDEF'; 
$arr[] = 'DEFABCGHI'; 
$arr[] = 'DEFABCJKL'; 

print_r(longestCommonPrefixes($arr)); 

ergibt

Array 
(
    [0] => ABCDEF 
    [1] => DEFABC 
) 
0

Ich habe mit einer Lösung für mein erstes Problem kommen:

EDIT: WAGEN!

$arr = array(); 

// Bug: ABCDEFX 

$arr[] = 'ABCDEFAXC'; 
$arr[] = 'ABCDEFDXF'; 
$arr[] = 'ABCDEFGXI'; 
$arr[] = 'ABCDEFJXL'; 

/* 
$arr[] = 'ABCDEFABC'; 
$arr[] = 'ABCDEFDEF'; 
$arr[] = 'ABCDEFGHI'; 
$arr[] = 'ABCDEFJKL'; 
*/ 

// ABCDEF  
$result = implode('', call_user_func_array('array_intersect_assoc', array_map('str_split', $arr))); 

One links jetzt gehen ...

Verwandte Themen