2017-11-24 3 views
0

Ich habe eine Zeichenfolge, die von MySQL-Abfrage erstellen ist:PHP rekursive Funktion Ausgabe Teil der Zeichenfolge zu holen

$str = "CREATE TABLE `custom_groupmanager` (
    `groupid` int(11) NOT NULL AUTO_INCREMENT, 
    `groupname` varchar(100) DEFAULT NULL, 
    `owner` int(4) DEFAULT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    `active` int(1) DEFAULT NULL, 
    `pid` int(4) DEFAULT NULL, 
    `col1` int(5) DEFAULT NULL, 
    `col2` int(5) DEFAULT NULL, 
    PRIMARY KEY (`groupid`), 
    UNIQUE KEY `groupname` (`groupname`,`pid`), 
    UNIQUE KEY `somaname` (`col1`,`col2`) 
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1"; 

Ich brauche die eindeutigen Schlüssel in Array wie diese

Array 
(
    [0] => UNIQUE KEY `groupname` (`groupname`,`pid`) 
    [1] => UNIQUE KEY `somaname` (`col1`,`col2`) 
) 

So bekomme ich m eine rekursive Funktion versucht, aber es scheint fail.This ist mein Code

$tmparr = array(); 
$newarray = filterunique($str,$tmparr); 
function filterunique($str,$tmparr){ 
    if(strpos($str, "UNIQUE KEY") != FALSE){ 
    $unitmp = strstr($str,"UNIQUE KEY"); 
    $tmpstr = strstr($unitmp,")",TRUE)."),\n"; 
    array_push($tmparr,strstr($unitmp,")",TRUE).")"); 
    print_r($tmparr); 

    $str=str_replace($tmpstr, "", $str); 

    filterunique($str,$tmparr); 
    }else{ 
     return $tmparr; 
    } 
} 
print_r($newarray); 

Bitte helfen sie mir zu verstehen, wo ich falsch mache.

+4

Warum nicht regex - https://regex101.com/r/dJW7An/1? – splash58

+0

Sie könnten einfach reguläre Ausdrücke mit dieser Art von Aufgabe verwenden, Beispiel oben^ – Ghost

+0

Regex ist in Ordnung. Aber ich versuche herauszufinden, was ich falsch gemacht – Francis

Antwort

1

Ich habe Ihren Code überarbeitet. Sie machte zwei Fehler:

machen $ tmpstr Sie \n Wich verwenden vielleicht ‚\ r \ n‘ in den Fenstern, und Komma hinzufügen , nach Klammer ),, die in der zweiten Zeile fehlt. Daher entfernt der Code die gefundene Zeichenfolge nicht, wodurch eine Endlosschleife entsteht.

Und der zweite Fehler ist, dass Sie nichts in If-True-Block zurückgeben.

function filterunique($str,$tmparr = []){ 
    if(strpos($str, "UNIQUE KEY") != FALSE) { 
    $unitmp = strstr($str,"UNIQUE KEY"); 
    $tmpstr = strstr($unitmp,")",TRUE).")"; 
    array_push($tmparr,$tmpstr); 
    $str = str_replace($tmpstr, '', $str); 
    $tmparr = filterunique($str,$tmparr); 
    } 
    return $tmparr; 
} 

Nach diesem Wechsel, code works

0

Sie regex verwenden können, um zu tun, was Sie wollen:

<?php 
$sql = 'CREATE TABLE `custom_groupmanager` (
    `groupid` int(11) NOT NULL AUTO_INCREMENT, 
    `groupname` varchar(100) DEFAULT NULL, 
    `owner` int(4) DEFAULT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    `active` int(1) DEFAULT NULL, 
    `pid` int(4) DEFAULT NULL, 
    `col1` int(5) DEFAULT NULL, 
    `col2` int(5) DEFAULT NULL, 
    PRIMARY KEY (`groupid`), 
    UNIQUE KEY `groupname` (`groupname`,`pid`), 
    UNIQUE KEY `somaname` (`col1`,`col2`) 
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1'; 

$matches = []; 
preg_match_all('/UNIQUE KEY.*\n/', $sql, $matches); 
var_dump($matches[0]); 

Sie werden ein Array wie dieses:

array(2) { 
    [0]=> 
    string(45) "UNIQUE KEY `groupname` (`groupname`,`pid`), 
" 
    [1]=> 
    string(39) "UNIQUE KEY `somaname` (`col1`,`col2`) 
" 
} 

Sie können die Regex verbessern (oder verwenden Sie array_map es zu tun) um das nachfolgende "," zu entfernen.

Und: vielleicht ist es bequemer, SQL zu tun, um diese Informationen zu erhalten, es scheint seltsam, SQL-String so zu analysieren.

Überprüfen Sie SQL - How to get the Unique Key's Column Name from Table, wenn Sie einige Beispiele möchten.

+0

In Ihrem Code: Sie vergessen eine Return-Filterunique – Bacteries