3v4l.org

run code in 300+ PHP versions simultaneously
<?php /* Projekt 1 - 09: XML Query v PHP 5 pro IPP 2014/2015 ** Jmeno a prijemni: Tomas Hynek (c) 2015 ** Login: xhynek09 */ header("Content-type: text/xml; charset=utf-8"); //################################################################################### //############################# HELP - NAPOVEDA ##################################### function help(){ echo "################################################################\n", "############### Projekt 1 - XQR v PHP 5.3.3 ####################\n", "############### Autor: Tomas Hynek (c) 2015 ####################\n", "############### Login: xhynek09 ####################\n", "############### Napoveda ke skriptu ####################\n", "## --help vypise na standardni vystup napovedu skriptu.\n\n", "## --input=filename\n\tzadany vstupni soubor muze byt zadan relativni cestou nebo absolutni cestou;v pripade, ze by\n\tnazev ci cesta obsahovala mezeru, tak musi byt uvedena cela cesta i se jmenem souboru v uvozovkach\n\t(znak uvozovek a rovnitka ve jmene soubory neni treba uvazovat); chybi-li tento parametr, tak je\n\tuvazovnan standardni vstup.\n\n", "## --output=filename\n\tzadany vystupni soubor muze byt zadan relativni cestou nebo absolutni cestou; v pripade, ze by nazev\n\tci cesta obsahovala mezeru, tak musi byt uvedena cesta i se jmenem souboru v uvozovkach (znak uvozovek\n\ta rovnitka ve jmene soubory neni treba uvazovat); chybi-li tento parametr, tak je vystup presmerovan\n\tna standardni vystup; existuje-li jiz vystupni soubor, bude bez varovani prepsan, jinak bude vytvoren\n\tnovy soubor.\n\n", "## --query='dotaz'\n\tzadany dotaz v dotazovacim jazyce definovanem nize (v pripade zadani timto zpusobem nebude dotaz\n\tobsahovat symbol apostrof).\n\n", "## --qf=filename\n\tdotaz v dotazovacim jazyce definovanem nize zadany v externim textovem souboru (nelze kombinovat s --query).\n\n", "## -n\tnegenerovat XML hlavicku na vystup skriptu.\n\n", "## --root=element\n\tjmeno paroveho korenoveho elementu obalujici vysledky. Pokud nebude zadan, tak se vysledky neobaluji\n\tkorenovym elementem, ac to porusuje validitu XML.\n\n"; } //################################################################################### //############### SEPARATE QUERY - VYHODNOCENI VYRAZU SELECT ######################## function separate_query($query) { global $select; global $limit; global $from; global $elem_or_atr; global $operator; global $literal; global $matches_out; global $type_liter; global $condition; global $from_all; $regex = "/^(SELECT\s[a-z]+)". "(\sLIMIT\s[0-9])*". "(\sFROM\sROOT|\sFROM\s[a-z]+\x2E[a-z]+|\sFROM\s\x2E[a-z]+|\sFROM\s[a-z]+)". "($|\sWHERE(\sNOT)?\s([a-z]+\x2E[a-z]+|\x2E[a-z]+|[a-z]+)\s". "((CONTAINS|\x3D|\x3C|\x3E)\s(\x22\w+\x22)|(\x3D|\x3C|\x3E)\s([0-9]+)))\z/"; if (!preg_match_all($regex, $query, $matches_out)) // funkce pracuje s RV a naplni dotaz do pole dle pravidel { file_put_contents('php://stderr', "Error - bad grammar of query\n"); exit(80); } // $count_q = count($matches_out); // for ($l=0; $l < $count_q; $l++) // { // print_r($matches_out[$l]); // } if (($matches_out[1][0]) !='') //SELECT element { $arr = explode("SELECT ", $matches_out[1][0]); // rozparsrovani na SELECT | element $select = $arr[1]; // vyjmuti element do $select echo ("select:".$select."\n"); } if (($matches_out[2][0]) !='') //LIMIT number { $arr = explode(" LIMIT ", $matches_out[2][0]); // rozparsrovani na SELECT | element $limit = $arr[1]; // vyjmuti element do $select echo ($limit."\n"); } if (($matches_out[3][0]) !='') //FROM <FROM-ELM> { $arr = explode(" FROM ", $matches_out[3][0]); // rozparsrovani na SELECT | element $from = $arr[1]; // vyjmuti element do $select echo ("from:".$from."\n"); if ($from == 'ROOT') {$from_all = 1;} } if (($matches_out[4][0]) !='') //WHERE exists? { $condition = 1; // YES } if (($matches_out[5][0]) !='') //NOT { $arr = explode(" ", $matches_out[5][0]); // rozparsrovani na SELECT | element $not = $arr[1]; echo ($not."\n"); } if (($matches_out[6][0]) !='') //<ELEMENT-OR-ATTRIBUTE> { $elem_or_atr = $matches_out[6][0]; // ulozeni do promenne echo ($elem_or_atr."\n"); } if (($matches_out[8][0]) !='') //<RELATION-OPERATOR> |<|>|=|CONTAINS| pro STRING { $opr = $matches_out[10][0]; // ulozeni relation operatoru if ($opr == '='){$operator=1;} else if($opr == '>'){$operator=2;} else {$operator=3;} echo ($operator."\n"); } if (($matches_out[9][0]) !='') //<LITERAL> STRING { $literal = $matches_out[9][0]; // ulozeni literalu - string $type_liter = 1; echo ($type_liter."\n"); } if (($matches_out[10][0]) !='') //<RELATION-OPERATOR> |<|>|=| pro NUM { $opr = $matches_out[10][0]; // ulozeni relation operatoru if ($opr == '='){$operator=1;} else if($opr == '>'){$operator=2;} else {$operator=3;} echo ($operator."\n"); } if (($matches_out[11][0]) !='') //<LITERAL> NUM { $literal = $matches_out[11][0]; // ulozeni literalu - num $type_liter = 2; echo ($type_liter."\n"); } return; } //################################################################################### //##################### PROHLEDAVANI a ZPRACOVANI WHERE ############################# function searchWhere($key, $array, $simple_obj) { if (array_key_exists($key, $array)) { foreach ($array as $index => $subarray) { if ($index == $key) { if (is_object($subarray)) { echo $index." je to object\n"; //$simple_obj = new SimpleXMLElement("<{$index}>{$key}</{$index}>"); $simple_obj->addChild($key, $subarray); print_r($simple_obj); } echo("item find: {$index}=>{$key}\n"); } } return; } else { foreach ($array as $index => $subarray) { echo("RE-SEACHING {$index} FOR : {$key}\n"); return search($subarray, $key, $simple_obj); } } return; } //################################################################################### //#################### PROHLEDAVANI a ZPRACOVANI SELECT ############################# function search($array, $key, $simple_out) { global $select, $rt, $root_elem, $from; if (!is_object($simple_out) && ($rt == 1)) { $simple_out = new SimpleXMLElement("<{$root_elem}></{$root_elem}>"); } if (array_key_exists($key, $array)) { foreach ($array as $index => $subarray) { if ($index == $key ) { if (is_object($subarray)) { echo $index." je to object\n"; print_r($simple_out); } if ($rt != 1) { $simple_out = new SimpleXMLElement("<{$index}></{$index}>"); echo("item find: {$index}=>{$key}\n"); searchWhere($select, $subarray, $simple_out); } else { echo("item find: {$index}=>{$key}\n"); $elem = $simple_out->addChild($index); searchWhere($select, $subarray, $elem); } } return $simple_out; } } else { foreach ($array as $index => $subarray) { echo("RE-SEACHING {$index} FOR : {$key}\n"); return search($subarray, $key, $simple_out); } } return; } //################################################################################### //################# PROHLEDAVANI a ZPRACOVANI PRI FROM ROOT ######################### function searchRoot($array, $key, $simple_out) { global $rt, $root_elem; if (!is_object($simple_out) && ($rt == 1)) { $simple_out = new SimpleXMLElement("<{$root_elem}></{$root_elem}>"); } echo "zpracovavam ROOT\n"; if (array_key_exists($key, $array)) { foreach ($array as $index => $subarray) { if ($index == $key ) { if ($rt == 1) // pokud --root=element { $elem = $simple_out->addChild($index); } else // pokud neni zadan --root= { if (!is_object($simple_out)) // tady jeste nevim jeslti to je dobre, jestli vytvorit book jednou nebo dvakrat?? { // viz sekvence prikazu php -d open_basedir="" xqr.php --input=xml02.in --qf=query02.qu $simple_out = new SimpleXMLElement("<{$index}></{$index}>"); $elem = $simple_out; } } foreach ($subarray as $child => $data) { echo("vypisek: {$child}=>{$data}\n"); $elem->addChild($child, $data); } } } return $simple_out; } else { foreach ($array as $index => $subarray) { echo("RE-SEACHING {$index} FOR : {$key}\n"); return searchRoot($subarray, $key, $simple_out); } } return; } //################################################################################### //########################## HLAVNI PROGRAM SKRIPTU ################################# //################################################################################### $in = 0; // indikace parametru --input $out = 0; // indikace parametru --output $qr = 0; // indikace parametru --query $qf = 0; // indikace parametru --qf $rt = 0; // indikace parametru --root $n = 0; // indikace parametru -n $root=0; // 0-nic, 1-ROOT... jmeno paroveho korenoveho elementu obalujici vysledky $type_liter=0; // 0-nic, 1-string, 2-num $condition=0; // 0-bez podminky, 1-s podminkou $xml_arr = 0; // global $from, $from_all; // $operator = 0; // 0-nic, 1-equal, 2-more, 3-less //$input; // v stupni soubor //$output; // vystupni soubor //$query; // zadany dotaz v dotaz. jazyce //$qfile; // zadany dotaz v externim textovem souboru //$root_elem; // ulozen obalujici root //$xml_arr_out; //########################### ZPRACOVANI ARGUMENTU ################################## for ($i = 0; $i < $argc; $i++) { if ($i > 0) // pokud prochazime druhy argument a vyse..... { if ((strpos($argv[$i], '--help')) !== false) // ---help { $help = explode("--help", $argv[$i]); if (($argc > 2) || ($help[1] != "") || ($help[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } help(); // konec skriptu bez chyby exit(0); } else if ((strpos($argv[$i], '--input=')) !== false) // --input { $input = explode("--input=", $argv[$i]); if (($input[1] == "") || ($input[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } if (file_exists("$input[1]")) { fclose(STDIN); $xml_arr = simplexml_load_file("$input[1]"); //echo "ZDE JE ROOT ELEMENT: ".$xml_arr->getName()."\n"; if($xml_arr === FALSE) { file_put_contents('php://stderr', "Error - file isnt exist\n"); exit(2); } //print_r($xml); } else { file_put_contents('php://stderr', "Error - file isnt exist\n"); exit(2); } $in += 1; } else if ((strpos($argv[$i], '--output=')) !== false) // --output { $output = explode("--output=", $argv[$i]); if (($output[1] == "") || ($output[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } //fclose(STDOUT); $fopen_out = fopen("$output[1]", 'w'); $fopen_final_out = $output[1]; echo $fopen_out."\n"; $out += 1; } else if ((strpos($argv[$i], '--query=')) !== false) // --query { $query = explode("--query=", $argv[$i]); if (($query[1] == "") || ($query[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } separate_query($query[1]); $qr += 1; } else if ((strpos($argv[$i], '--qf=')) !== false) // --qf { $qfile = explode("--qf=", $argv[$i]); if (($qfile[1] == "") || ($qfile[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } if (!(is_readable($qfile[1]))) { file_put_contents('php://stderr', "Error - file isnt exist\n"); exit(2); // spatny format parametru nebo zakazana kombinace parametru } $query_string = file_get_contents($qfile[1]); var_dump($query_string); separate_query($query_string); $qf += 1; } else if ((strpos($argv[$i], '--root=')) !== false) // --root { $root = explode("--root=", $argv[$i]); if (($root[1] == "") || ($root[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } $root_elem = $root[1]; $rt += 1; } else if ((strpos($argv[$i], '-n')) !== false) // -n { $n += 1; } else // jine argumenty nejsou povoleny { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } } } //################################################################################### if (($in > 1)||($out > 1)||($qr > 1)||($qf > 1)||($rt > 1)||($n > 1)) // pokud se nejaky parametr opakuje { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } if (($qr > 0) && ($qf > 0)) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } print_r($xml_arr); if ($from_all == 0) { $xml_out = search($xml_arr, $from, NULL); } else { $xml_out = searchRoot($xml_arr, $select, NULL); } echo"\n##### Konecna tabulka obejktu ##### \n"; //print_r($xml_out); //var_dump($arr); if (is_object($xml_out)) { $xml_final_output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; if ($xml_final_output = $xml_out->asXML()) // prevedeni zpet na XML { echo "wwwwwtttttttttttffffffffff\n"; if ($out == 1) { $xml_out->asXML("$fopen_final_out"); fclose($fopen_out); } else { echo $xml_final_output; } } else { file_put_contents('php://stderr', "Error - pri prevodu na XML format!\n"); exit(100); } } //else ////// totot haze exit 100 pri skriptu test01 ......whaaaaat?????? //{ // file_put_contents('php://stderr', "Error - pri prevodu na XML format!\n"); // exit(100); //} echo "\n"; exit(0); // konec skriptu bez chyby

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.60.0090.00618.55
8.3.50.0080.01022.04
8.3.40.0090.00618.82
8.3.30.0120.00319.17
8.3.20.0000.00820.41
8.3.10.0120.00322.02
8.3.00.0040.00419.14
8.2.180.0130.01018.66
8.2.170.0060.00922.96
8.2.160.0150.00022.14
8.2.150.0030.00624.18
8.2.140.0040.00424.66
8.2.130.0040.00426.16
8.2.120.0040.00419.80
8.2.110.0100.00021.11
8.2.100.0080.00817.80
8.2.90.0140.00718.01
8.2.80.0040.00418.05
8.2.70.0090.00017.80
8.2.60.0040.00418.16
8.2.50.0030.00618.10
8.2.40.0050.00321.02
8.2.30.0060.00319.55
8.2.20.0030.00517.90
8.2.10.0030.00518.21
8.2.00.0080.00018.00
8.1.280.0090.00625.92
8.1.270.0040.00419.05
8.1.260.0080.00026.35
8.1.250.0050.00328.09
8.1.240.0090.00023.93
8.1.230.0090.00321.31
8.1.220.0000.00917.90
8.1.210.0040.00419.10
8.1.200.0060.00317.47
8.1.190.0000.00817.60
8.1.180.0050.00518.10
8.1.170.0030.00518.75
8.1.160.0040.00419.07
8.1.150.0040.00418.99
8.1.140.0040.00417.69
8.1.130.0000.00817.94
8.1.120.0000.00717.64
8.1.110.0030.00517.63
8.1.100.0040.00417.68
8.1.90.0050.00317.68
8.1.80.0000.00817.65
8.1.70.0000.00717.63
8.1.60.0060.00317.67
8.1.50.0060.00317.60
8.1.40.0030.00617.59
8.1.30.0040.00417.89
8.1.20.0040.00417.79
8.1.10.0040.00717.79
8.1.00.0030.00617.71
8.0.300.0000.00819.85
8.0.290.0030.00617.00
8.0.280.0040.00418.64
8.0.270.0000.00717.38
8.0.260.0030.00317.51
8.0.250.0000.00817.10
8.0.240.0040.00417.10
8.0.230.0040.00417.26
8.0.220.0050.00217.08
8.0.210.0030.00317.09
8.0.200.0000.00817.19
8.0.190.0030.00617.06
8.0.180.0000.00817.18
8.0.170.0000.00817.21
8.0.160.0080.00017.20
8.0.150.0040.00417.15
8.0.140.0040.00417.14
8.0.130.0000.00613.62
8.0.120.0030.00616.94
8.0.110.0040.00417.13
8.0.100.0040.00417.02
8.0.90.0040.00417.01
8.0.80.0060.01617.21
8.0.70.0040.00417.11
8.0.60.0040.00417.04
8.0.50.0000.00817.07
8.0.30.0140.01017.36
8.0.20.0090.01017.41
8.0.10.0030.00517.07
8.0.00.0080.01117.03
7.4.330.0030.00315.03
7.4.320.0040.00416.80
7.4.300.0070.00016.84
7.4.290.0040.00416.69
7.4.280.0060.00316.70
7.4.270.0040.00416.60
7.4.260.0080.00016.59
7.4.250.0080.00016.77
7.4.240.0030.00516.75
7.4.230.0040.00416.91
7.4.220.0170.01716.85
7.4.210.0040.01816.70
7.4.200.0050.00316.89
7.4.160.0080.00816.52
7.4.150.0150.01117.40
7.4.140.0050.01317.86
7.4.130.0090.00816.64
7.4.120.0100.00716.76
7.4.110.0130.01216.72
7.4.100.0130.01016.64
7.4.90.0120.00616.79
7.4.80.0030.01819.39
7.4.70.0100.01016.70
7.4.60.0140.00916.53
7.4.50.0000.00816.83
7.4.40.0030.01316.68
7.4.30.0120.00616.56
7.4.00.0030.01315.39
7.3.330.0030.00313.48
7.3.320.0000.00513.54
7.3.310.0050.00316.41
7.3.300.0000.00716.53
7.3.290.0080.00716.52
7.3.280.0080.01116.56
7.3.270.0040.01417.40
7.3.260.0090.00916.48
7.3.250.0110.00716.67
7.3.240.0130.00616.84
7.3.230.0180.00316.64
7.3.210.0190.00016.75
7.3.200.0170.00519.39
7.3.190.0100.00716.74
7.3.180.0120.00616.66
7.3.170.0080.01416.81
7.3.160.0040.01316.68
7.2.330.0070.01716.83
7.2.320.0050.01216.95
7.2.310.0060.01516.68
7.2.300.0130.01317.01
7.2.290.0120.00616.86
7.2.00.0040.01119.56
7.1.200.0100.00515.70
7.1.100.0030.00618.13
7.1.70.0130.00316.93
7.1.60.0100.01419.57
7.1.50.0100.01416.97
7.1.00.0070.07322.45
7.0.200.0040.00716.84
7.0.140.0100.04721.96
7.0.100.0100.07720.13
7.0.90.0100.08320.12
7.0.80.0070.08720.09
7.0.70.0100.07720.11
7.0.60.0030.06019.96
7.0.50.0170.07720.49
7.0.40.0200.04320.11
7.0.30.0030.04720.08
7.0.20.0070.04320.05
7.0.10.0100.03720.10
7.0.00.0030.04320.06
5.6.280.0030.07721.15
5.6.250.0100.06320.71
5.6.240.0100.08320.63
5.6.230.0130.07720.86
5.6.220.0130.04720.70
5.6.210.0200.07020.71
5.6.200.0030.08321.06
5.6.190.0030.05721.13
5.6.180.0130.03721.12
5.6.170.0030.04321.26
5.6.160.0030.04021.13
5.6.150.0000.04321.17
5.6.140.0030.04321.05
5.6.130.0070.03721.11
5.6.120.0030.05721.03
5.6.110.0000.04721.13
5.6.100.0070.03721.07
5.6.90.0070.03721.00
5.6.80.0070.03320.35
5.6.70.0030.08020.54
5.6.60.0030.04020.48
5.6.50.0030.04320.42
5.6.40.0070.04720.39
5.6.30.0100.03020.39
5.6.20.0130.03320.57
5.6.10.0130.03020.44
5.6.00.0100.04020.53
5.5.380.0000.08720.59
5.5.370.0100.07720.44
5.5.360.0130.07720.43
5.5.350.0100.08020.47
5.5.340.0270.03720.89
5.5.330.0030.06720.82
5.5.320.0100.03720.87
5.5.310.0030.04021.00
5.5.300.0070.04720.80
5.5.290.0100.08320.99
5.5.280.0030.05020.82
5.5.270.0030.04320.92
5.5.260.0070.07020.95
5.5.250.0000.04320.82
5.5.240.0000.04020.21
5.5.230.0030.04020.33
5.5.220.0070.03720.33
5.5.210.0070.03720.27
5.5.200.0100.06020.37
5.5.190.0070.03720.23
5.5.180.0100.03720.20
5.5.160.0030.04020.36
5.5.150.0030.04020.27
5.5.140.0070.03720.23
5.5.130.0030.04020.19
5.5.120.0070.03720.32
5.5.110.0100.04720.32
5.5.100.0030.03720.10
5.5.90.0070.03320.09
5.5.80.0100.03320.20
5.5.70.0000.04720.13
5.5.60.0070.03720.02
5.5.50.0030.04320.24
5.5.40.0100.06020.14
5.5.30.0130.06320.24
5.5.20.0030.08020.00
5.5.10.0070.07020.23
5.5.00.0030.08020.06
5.4.450.0100.05719.37
5.4.440.0070.04019.50
5.4.430.0030.06319.50
5.4.420.0070.04319.24
5.4.410.0030.04019.36
5.4.400.0100.06319.17
5.4.390.0100.04019.23
5.4.380.0070.03319.23
5.4.370.0030.06019.05
5.4.360.0000.04018.89
5.4.350.0070.03319.09
5.4.340.0030.04019.08
5.4.320.0130.04319.09
5.4.310.0000.04019.14
5.4.300.0030.05019.13
5.4.290.0000.04719.16
5.4.280.0070.03319.09
5.4.270.0070.03319.16
5.4.260.0070.03719.16
5.4.250.0030.03718.91
5.4.240.0070.05719.22
5.4.230.0070.03718.98
5.4.220.0000.04319.22
5.4.210.0030.08719.13
5.4.200.0000.08018.96
5.4.190.0130.06319.22
5.4.180.0070.04719.05
5.4.170.0000.08019.08
5.4.160.0130.07318.91
5.4.150.0070.07719.21
5.4.140.0100.04316.57
5.4.130.0030.07316.47
5.4.120.0030.07716.48
5.4.110.0070.07316.53
5.4.100.0100.06716.34
5.4.90.0130.06716.45
5.4.80.0170.06016.40
5.4.70.0070.07316.43
5.4.60.0000.06316.40
5.4.50.0030.04016.46
5.4.40.0100.07016.48
5.4.30.0030.05316.46
5.4.20.0070.04016.51
5.4.10.0130.07016.50
5.4.00.0030.06015.95

preferences:
66.03 ms | 401 KiB | 5 Q