41 Востаннє редагувалося Vo_Vik (02.10.2012 22:43:48)

Re: Фільтрація номерів за маскою (задача на 5+)

Трохи величенький у мене код получився на швидку руку

Прихований текст
<?
include 'list.php';
$maxLenght = 8;
$support_symbols = array(' ','+','-');
$list = explode("\n",str_replace($support_symbols,'',$list));
echo '<form method="post">';
echo 'Please enter mask (will be cat to '.$maxLenght.' symbols):<input type="text" name="mask" value="'.(isset($_POST['mask'])?$_POST['mask']:'').'">';
echo '</form>';
if(isset($_POST['mask']) && $_POST['mask']){
    $_POST['mask']=substr($_POST['mask'],0,$maxLenght);
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $starttime = $mtime;
//end check time
    $masks=getMasks($_POST['mask']);
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime = $mtime;
   $totaltime = ($endtime - $starttime);
   echo "Mask generation time =".$totaltime." seconds<br />";
//end check time
    $numbers = array();
    foreach($list as $number)
        foreach($masks as $mask)
            if (strstr($number,$mask)) $numbers[] = $number;
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime2 = $mtime;
   $totaltime = ($endtime2 - $endtime);
   echo "Mask comparation time =".$totaltime." seconds<br />";
//end check time
    echo "Total selected ".count($numbers)." numbers<br />";
    echo "Mask: ".$_POST['mask'];
    echo '<pre>'.print_r($numbers,true);
}
function getMasks($string) {
    $charMask=str_split($string);
    $listMasks= array();
    $uniqueChars =  array_values(array_unique($charMask));
    return setMasks(array(), $uniqueChars, $string, array());
}
function setMasks($inputMasks, $uniqueChars, $string, $excludedNumbers) {
    if(!count($inputMasks)) {
        $inputMasks = array($string);
    }
    if(count($uniqueChars)){
        $charNumber = count($uniqueChars)-1;
        if(is_numeric($uniqueChars[$charNumber])) {
            unset($uniqueChars[$charNumber]);
            return setMasks($inputMasks, $uniqueChars, $string, $excludedNumbers);
        }
        else {
            $outputMasks = array();
            $letter = $uniqueChars[$charNumber];
            unset($uniqueChars[$charNumber]);
            for($i=0;$i<=9;$i++) {
                if(!in_array($i, $excludedNumbers)) {
                    $outputMasks = array_merge($outputMasks,
                        setMasks(
                            replaceChar($inputMasks, $letter, $i)
                                , $uniqueChars, $string, array_merge($excludedNumbers, array($i))));
                }
            }
            return $outputMasks;
        }
    }
    else {
        return $inputMasks;
    }
}

function replaceChar($inputMasks, $letter, $i) {
    foreach($inputMasks as $key=>$value)
        $inputMasks[$key] = str_replace($letter, $i, $value);
    return $inputMasks;
}
?>

Ось результати на локальному сервері:
Mask generation time =0.0101351737976 seconds
Mask comparation time =0.113929033279 seconds
Total selected 440 numbers
Mask: abb

Код дуже сильно не оптимізований, так що прошу не бити.

42

Re: Фільтрація номерів за маскою (задача на 5+)

Vo_Vik, в мене якщо ввести маску, наприклад, aabb, то відбувається щось не зрозуміле. Вилітає купа помилок

43

Re: Фільтрація номерів за маскою (задача на 5+)

Маски з початкового повідомлення:
Mask generation time =0.00119996070862 seconds
Mask comparation time =0.0140080451965 seconds
Total selected 146 numbers
Mask: aaa

Mask generation time =0.0101809501648 seconds
Mask comparation time =0.110705852509 seconds
Total selected 71 numbers
Mask: abab

Mask generation time =0.00037693977356 seconds
Mask comparation time =0.00153803825378 seconds
Total selected 0 numbers
Mask: 3520

Зараз попробую поміняти час для ваших пропозицій

44 Востаннє редагувалося Vo_Vik (02.10.2012 22:47:56)

Re: Фільтрація номерів за маскою (задача на 5+)

Replace написав:

Vo_Vik, в мене якщо ввести маску, наприклад, aabb, то відбувається щось не зрозуміле. Вилітає купа помилок

Я поправив там код, скопіюй ще раз. Там були не передбачені мною результати роботи фунції array_unique (треба було мені читати спек по цій фунції).

45 Востаннє редагувалося Vo_Vik (02.10.2012 22:50:21)

Re: Фільтрація номерів за маскою (задача на 5+)

Киньте прямий лінк на пост з кодом який перевіряти?
Бо тут багато, я не знаю який брати.

46

Re: Фільтрація номерів за маскою (задача на 5+)

Vo_Vik, тепер все ок :)
Круто!

47

Re: Фільтрація номерів за маскою (задача на 5+)

Взяв скрип з першої сторінки
Mask generation time =0.00117087364197 seconds
Mask comparation time =0.0128569602966 seconds
funivan time =0.00933504104614 seconds
Total selected 146 numbers
Total selected (funivan)146 numbers
Mask: aaa

Mask generation time =0.0102281570435 seconds
Mask comparation time =0.111648797989 seconds
funivan time =0.00789022445679 seconds
Total selected 22 numbers
Total selected (funivan)22 numbers
Mask: baaaa

Mask generation time =0.0102889537811 seconds
Mask comparation time =0.11391210556 seconds
funivan time =0.00801491737366 seconds
Total selected 9 numbers
Total selected (funivan)9 numbers
Mask: baaaaa

Програю... Треба оптимізовувати)

48 Востаннє редагувалося Vo_Vik (02.10.2012 23:00:06)

Re: Фільтрація номерів за маскою (задача на 5+)

Mask generation time =0.633529901505 seconds
Mask comparation time =6.90646100044 seconds
funivan time =0.0212790966034 seconds
Total selected 1038 numbers
Total selected (funivan)280 numbers
Mask: abcd

Отут розбіжності в підрахунку. Мій працює правильно.
funivan правте свій, будем тоді порівнювати)

49

Re: Фільтрація номерів за маскою (задача на 5+)

Перевірте ще цей варіант http://replace.org.ua/post/1956/#p1956
Використовується на реальному сайті з відвідуваністю близько 1000 в день. :)

50 Востаннє редагувалося Vo_Vik (02.10.2012 23:11:09)

Re: Фільтрація номерів за маскою (задача на 5+)

Модифікував 29-й рядок:
if (strstr($number,$mask)) $numbers[] = str_replace($mask,('<b>'.$mask.'</b>'),$number);
підсвічує співпадіння.

Mask generation time =0.627213954926 seconds
Mask comparation time =6.88600301743 seconds
funivan time =0.0183298587799 seconds
Total selected 189 numbers
Total selected (funivan)151 numbers
Mask: abcda
для цієї маски теж розбіжність.

Біжу додому, завтра ще гляну.

51

Re: Фільтрація номерів за маскою (задача на 5+)

Перш за все вибачаюсь перед паном funivan, швидше за все розбіжності в тому, що мій скрипт не виходить при першому співпадінні маски. Тому один і той саме номер може по’являтись в списку двічі з різними масками.
Потім перевірю, бо поки їхав додому придумав більш оптимальний метод. Зараз реалізую.

52

Re: Фільтрація номерів за маскою (задача на 5+)

Ось результати з домашнього комп'ютера(трохи слабший, але зате замість апача nginx)
Mask generation time =0.079050064086914 seconds
Mask comparation time =0.49399590492249 seconds
funivan time =0.0050790309906006 seconds
Total selected 152 numbers
Total selected funivan151 numbers
Mask: abcda

у funivan пропущений телефон [150] => 380666662316

Решта результатів ніби співпадають. Берусь за свій покращений алгоритм, бо дотепер з малою няньчився.

53 Востаннє редагувалося Vo_Vik (03.10.2012 06:20:36)

Re: Фільтрація номерів за маскою (задача на 5+)

Ну що є результати)
Replace, я напевно невірно вашій фунції маску передаю, бо вона щось дуже багато варіантів видає.
Отже результати

"таймінги (моя покращена функція під кодовим ім’ям smart)"

Mask generation time =0.077295064926147 seconds
Mask comparation time =0.490483045578 seconds
funivan time =0.0046179294586182 seconds
smart time =0.0076920986175537 seconds
Replace time =0.011405944824219 seconds
Total selected 152 numbers
Total selected funivan 151 numbers
Total selected smart 152 numbers
Total selected replace 215 numbers
Mask: abcda

"одержані масиви для порівняння"

Array
(
    [0] => 0679093111
    [1] => 0675961717
    [2] => 0679093335
    [3] => 380934379999
    [4] => 380638347777
    [5] => 380639916666
    [6] => 380931293333
    [7] => 380638873333
    [8] => 380931172222
    [9] => 380935182222
    [10] => 380931177717
    [11] => 380931177776
    [12] => 380931177775
    [13] => 380931177774
    [14] => 380638800777
    [15] => 380931177333
    [16] => 380931177799
    [17] => 380931172233
    [18] => 380634131131
    [19] => 380636227227
    [20] => 380634119411
    [21] => 380639909903
    [22] => 380931288889
    [23] => 380638492000
    [24] => 380931293000
    [25] => 380633709111
    [26] => 380938566111
    [27] => 380635884111
    [28] => 380938106111
    [29] => 380634306111
    [30] => 380931566111
    [31] => 380938155222
    [32] => 380938106222
    [33] => 380938566222
    [34] => 380634331222
    [35] => 380634306222
    [36] => 380931576333
    [37] => 380634219333
    [38] => 380637230333
    [39] => 380636168333
    [40] => 380634101333
    [41] => 380634219444
    [42] => 380931576444
    [43] => 380938045444
    [44] => 380639902444
    [45] => 380934391555
    [46] => 380934124555
    [47] => 380639902555
    [48] => 380935781666
    [49] => 380935137666
    [50] => 380938069666
    [51] => 380636224666
    [52] => 380632775666
    [53] => 380931580666
    [54] => 380638373666
    [55] => 380931575666
    [56] => 380936572777
    [57] => 380938549777
    [58] => 380938549888
    [59] => 380636184888
    [60] => 380938565888
    [61] => 380931565888
    [62] => 380931575888
    [63] => 380635883999
    [64] => 380935137999
    [65] => 380637878999
    [66] => 380931292999
    [67] => 380935182020
    [68] => 380638405151
    [69] => 380637879494
    [70] => 380931172727
    [71] => 380633709070
    [72] => 380639909911
    [73] => 380639909696
    [74] => 380639909797
    [75] => 380639909799
    [76] => 380639909699
    [77] => 380938550003
    [78] => 380938550044
    [79] => 380634331166
    [80] => 380634331188
    [81] => 380634331199
    [82] => 380637878989
    [83] => 380639909919
    [84] => 380639909959
    [85] => 380931288828
    [86] => 380936556665
    [87] => 380639912424
    [88] => 380938583131
    [89] => 380938584242
    [90] => 380636084545
    [91] => 380633134646
    [92] => 380938584848
    [93] => 380938585353
    [94] => 380938586363
    [95] => 380639916767
    [96] => 380639916868
    [97] => 380636227474
    [98] => 380636207979
    [99] => 380636228181
    [100] => 380636228787
    [101] => 380637879009
    [102] => 380639912340
    [103] => 380638455544
    [104] => 380638455505
    [105] => 380639912299
    [106] => 380639915533
    [107] => 380639915500
    [108] => 380639916600
    [109] => 380634546611
    [110] => 380634546655
    [111] => 380639916688
    [112] => 380634546677
    [113] => 380639911880
    [114] => 380936556766
    [115] => 380639911616
    [116] => 380938069699
    [117] => 380639909899
    [118] => 380639909930
    [119] => 380639909960
    [120] => 380639909917
    [121] => 380639909934
    [122] => 380639909932
    [123] => 380639909940
    [124] => 380639909941
    [125] => 380639909947
    [126] => 380639909948
    [127] => 380639909951
    [128] => 380639909952
    [129] => 380639909915
    [130] => 380981728000
    [131] => 380678698555
    [132] => 380678619666
    [133] => 380970292888
    [134] => 380974393339
    [135] => 380678677767
    [136] => 380970292959
    [137] => 380678656566
    [138] => 380678619991
    [139] => 380974394448
    [140] => 380678149990
    [141] => 380678149991
    [142] => 380678149992
    [143] => 380678149993
    [144] => 380678149994
    [145] => 380678149995
    [146] => 380678149996
    [147] => 380978666689
    [148] => 380978666766
    [149] => 380958551234
    [150] => 380666662316
    [151] => 380954815444
)

   

Array
(
    [0] => 0679093111
    [1] => 0675961717
    [2] => 0679093335
    [3] => 380934379999
    [4] => 380638347777
    [5] => 380639916666
    [6] => 380931293333
    [7] => 380638873333
    [8] => 380931172222
    [9] => 380935182222
    [10] => 380931177717
    [11] => 380931177776
    [12] => 380931177775
    [13] => 380931177774
    [14] => 380638800777
    [15] => 380931177333
    [16] => 380931177799
    [17] => 380931172233
    [18] => 380634131131
    [19] => 380636227227
    [20] => 380634119411
    [21] => 380639909903
    [22] => 380931288889
    [23] => 380638492000
    [24] => 380931293000
    [25] => 380633709111
    [26] => 380938566111
    [27] => 380635884111
    [28] => 380938106111
    [29] => 380634306111
    [30] => 380931566111
    [31] => 380938155222
    [32] => 380938106222
    [33] => 380938566222
    [34] => 380634331222
    [35] => 380634306222
    [36] => 380931576333
    [37] => 380634219333
    [38] => 380637230333
    [39] => 380636168333
    [40] => 380634101333
    [41] => 380634219444
    [42] => 380931576444
    [43] => 380938045444
    [44] => 380639902444
    [45] => 380934391555
    [46] => 380934124555
    [47] => 380639902555
    [48] => 380935781666
    [49] => 380935137666
    [50] => 380938069666
    [51] => 380636224666
    [52] => 380632775666
    [53] => 380931580666
    [54] => 380638373666
    [55] => 380931575666
    [56] => 380936572777
    [57] => 380938549777
    [58] => 380938549888
    [59] => 380636184888
    [60] => 380938565888
    [61] => 380931565888
    [62] => 380931575888
    [63] => 380635883999
    [64] => 380935137999
    [65] => 380637878999
    [66] => 380931292999
    [67] => 380935182020
    [68] => 380638405151
    [69] => 380637879494
    [70] => 380931172727
    [71] => 380633709070
    [72] => 380639909911
    [73] => 380639909696
    [74] => 380639909797
    [75] => 380639909799
    [76] => 380639909699
    [77] => 380938550003
    [78] => 380938550044
    [79] => 380634331166
    [80] => 380634331188
    [81] => 380634331199
    [82] => 380637878989
    [83] => 380639909919
    [84] => 380639909959
    [85] => 380931288828
    [86] => 380936556665
    [87] => 380639912424
    [88] => 380938583131
    [89] => 380938584242
    [90] => 380636084545
    [91] => 380633134646
    [92] => 380938584848
    [93] => 380938585353
    [94] => 380938586363
    [95] => 380639916767
    [96] => 380639916868
    [97] => 380636227474
    [98] => 380636207979
    [99] => 380636228181
    [100] => 380636228787
    [101] => 380637879009
    [102] => 380639912340
    [103] => 380638455544
    [104] => 380638455505
    [105] => 380639912299
    [106] => 380639915533
    [107] => 380639915500
    [108] => 380639916600
    [109] => 380634546611
    [110] => 380634546655
    [111] => 380639916688
    [112] => 380634546677
    [113] => 380639911880
    [114] => 380936556766
    [115] => 380639911616
    [116] => 380938069699
    [117] => 380639909899
    [118] => 380639909930
    [119] => 380639909960
    [120] => 380639909917
    [121] => 380639909934
    [122] => 380639909932
    [123] => 380639909940
    [124] => 380639909941
    [125] => 380639909947
    [126] => 380639909948
    [127] => 380639909951
    [128] => 380639909952
    [129] => 380639909915
    [130] => 380981728000
    [131] => 380678698555
    [132] => 380678619666
    [133] => 380970292888
    [134] => 380974393339
    [135] => 380678677767
    [136] => 380970292959
    [137] => 380678656566
    [138] => 380678619991
    [139] => 380974394448
    [140] => 380678149990
    [141] => 380678149991
    [142] => 380678149992
    [143] => 380678149993
    [144] => 380678149994
    [145] => 380678149995
    [146] => 380678149996
    [147] => 380978666689
    [148] => 380978666766
    [149] => 380958551234
    [150] => 380954815444
)

   

Array
(
    [0] => 0679093111
    [1] => 0675961717
    [2] => 0679093335
    [3] => 380934379999
    [4] => 380638347777
    [5] => 380639916666
    [6] => 380931293333
    [7] => 380638873333
    [8] => 380931172222
    [9] => 380935182222
    [10] => 380931177717
    [11] => 380931177776
    [12] => 380931177775
    [13] => 380931177774
    [14] => 380638800777
    [15] => 380931177333
    [16] => 380931177799
    [17] => 380931172233
    [18] => 380634131131
    [19] => 380636227227
    [20] => 380634119411
    [21] => 380639909903
    [22] => 380931288889
    [23] => 380638492000
    [24] => 380931293000
    [25] => 380633709111
    [26] => 380938566111
    [27] => 380635884111
    [28] => 380938106111
    [29] => 380634306111
    [30] => 380931566111
    [31] => 380938155222
    [32] => 380938106222
    [33] => 380938566222
    [34] => 380634331222
    [35] => 380634306222
    [36] => 380931576333
    [37] => 380634219333
    [38] => 380637230333
    [39] => 380636168333
    [40] => 380634101333
    [41] => 380634219444
    [42] => 380931576444
    [43] => 380938045444
    [44] => 380639902444
    [45] => 380934391555
    [46] => 380934124555
    [47] => 380639902555
    [48] => 380935781666
    [49] => 380935137666
    [50] => 380938069666
    [51] => 380636224666
    [52] => 380632775666
    [53] => 380931580666
    [54] => 380638373666
    [55] => 380931575666
    [56] => 380936572777
    [57] => 380938549777
    [58] => 380938549888
    [59] => 380636184888
    [60] => 380938565888
    [61] => 380931565888
    [62] => 380931575888
    [63] => 380635883999
    [64] => 380935137999
    [65] => 380637878999
    [66] => 380931292999
    [67] => 380935182020
    [68] => 380638405151
    [69] => 380637879494
    [70] => 380931172727
    [71] => 380633709070
    [72] => 380639909911
    [73] => 380639909696
    [74] => 380639909797
    [75] => 380639909799
    [76] => 380639909699
    [77] => 380938550003
    [78] => 380938550044
    [79] => 380634331166
    [80] => 380634331188
    [81] => 380634331199
    [82] => 380637878989
    [83] => 380639909919
    [84] => 380639909959
    [85] => 380931288828
    [86] => 380936556665
    [87] => 380639912424
    [88] => 380938583131
    [89] => 380938584242
    [90] => 380636084545
    [91] => 380633134646
    [92] => 380938584848
    [93] => 380938585353
    [94] => 380938586363
    [95] => 380639916767
    [96] => 380639916868
    [97] => 380636227474
    [98] => 380636207979
    [99] => 380636228181
    [100] => 380636228787
    [101] => 380637879009
    [102] => 380639912340
    [103] => 380638455544
    [104] => 380638455505
    [105] => 380639912299
    [106] => 380639915533
    [107] => 380639915500
    [108] => 380639916600
    [109] => 380634546611
    [110] => 380634546655
    [111] => 380639916688
    [112] => 380634546677
    [113] => 380639911880
    [114] => 380936556766
    [115] => 380639911616
    [116] => 380938069699
    [117] => 380639909899
    [118] => 380639909930
    [119] => 380639909960
    [120] => 380639909917
    [121] => 380639909934
    [122] => 380639909932
    [123] => 380639909940
    [124] => 380639909941
    [125] => 380639909947
    [126] => 380639909948
    [127] => 380639909951
    [128] => 380639909952
    [129] => 380639909915
    [130] => 380981728000
    [131] => 380678698555
    [132] => 380678619666
    [133] => 380970292888
    [134] => 380974393339
    [135] => 380678677767
    [136] => 380970292959
    [137] => 380678656566
    [138] => 380678619991
    [139] => 380974394448
    [140] => 380678149990
    [141] => 380678149991
    [142] => 380678149992
    [143] => 380678149993
    [144] => 380678149994
    [145] => 380678149995
    [146] => 380678149996
    [147] => 380978666689
    [148] => 380978666766
    [149] => 380958551234
    [150] => 380666662316
    [151] => 380954815444
)

   

Array
(
    [0] => 0676633644
    [1] => 0674775771
    [2] => 0679155885
    [3] => 0679155991
    [4] => 380934379999
    [5] => 380638347777
    [6] => 380639916666
    [7] => 380931293333
    [8] => 380638873333
    [9] => 380931172222
    [10] => 380935182222
    [11] => 380931177717
    [12] => 380931177776
    [13] => 380931177775
    [14] => 380931177774
    [15] => 380638800777
    [16] => 380931177333
    [17] => 380931177799
    [18] => 380931172233
    [19] => 380634131131
    [20] => 380636227227
    [21] => 380634119411
    [22] => 380639909903
    [23] => 380931288889
    [24] => 380638492000
    [25] => 380931293000
    [26] => 380633709111
    [27] => 380938566111
    [28] => 380635884111
    [29] => 380938106111
    [30] => 380634306111
    [31] => 380931566111
    [32] => 380938155222
    [33] => 380938106222
    [34] => 380938566222
    [35] => 380634331222
    [36] => 380634306222
    [37] => 380931576333
    [38] => 380634219333
    [39] => 380637230333
    [40] => 380636168333
    [41] => 380634101333
    [42] => 380634219444
    [43] => 380931576444
    [44] => 380938045444
    [45] => 380639902444
    [46] => 380934391555
    [47] => 380934124555
    [48] => 380639902555
    [49] => 380935781666
    [50] => 380935137666
    [51] => 380938069666
    [52] => 380636224666
    [53] => 380632775666
    [54] => 380931580666
    [55] => 380638373666
    [56] => 380931575666
    [57] => 380936572777
    [58] => 380938549777
    [59] => 380938549888
    [60] => 380636184888
    [61] => 380938565888
    [62] => 380931565888
    [63] => 380931575888
    [64] => 380635883999
    [65] => 380935137999
    [66] => 380637878999
    [67] => 380931292999
    [68] => 380935182020
    [69] => 380638405151
    [70] => 380637879494
    [71] => 380931172727
    [72] => 380633709070
    [73] => 380639909911
    [74] => 380639909696
    [75] => 380639909797
    [76] => 380639909799
    [77] => 380639909699
    [78] => 380938550003
    [79] => 380938550044
    [80] => 380634331166
    [81] => 380634331188
    [82] => 380634331199
    [83] => 380637878989
    [84] => 380639909919
    [85] => 380639909959
    [86] => 380931288828
    [87] => 380936556665
    [88] => 380639912424
    [89] => 380938583131
    [90] => 380938584242
    [91] => 380636084545
    [92] => 380633134646
    [93] => 380938584848
    [94] => 380938585353
    [95] => 380938586363
    [96] => 380639916767
    [97] => 380639916868
    [98] => 380636227474
    [99] => 380636207979
    [100] => 380636228181
    [101] => 380636228787
    [102] => 380637879009
    [103] => 380639912340
    [104] => 380638455544
    [105] => 380638455505
    [106] => 380639912299
    [107] => 380639915533
    [108] => 380639915500
    [109] => 380639916600
    [110] => 380634546611
    [111] => 380634546655
    [112] => 380639916688
    [113] => 380634546677
    [114] => 380639911880
    [115] => 380936556766
    [116] => 380639911616
    [117] => 380938069699
    [118] => 380639909899
    [119] => 380639909930
    [120] => 380639909960
    [121] => 380639909917
    [122] => 380639909934
    [123] => 380639909932
    [124] => 380639909940
    [125] => 380639909941
    [126] => 380639909947
    [127] => 380639909948
    [128] => 380639909951
    [129] => 380639909952
    [130] => 380639909915
    [131] => 380981728000
    [132] => 380970168111
    [133] => 380970289222
    [134] => 380970277333
    [135] => 380677857333
    [136] => 380671168333
    [137] => 380963306444
    [138] => 380678698555
    [139] => 380678619666
    [140] => 380970292888
    [141] => 380965656560
    [142] => 380960901090
    [143] => 380965656363
    [144] => 380679884848
    [145] => 380988777667
    [146] => 380980080056
    [147] => 380974441134
    [148] => 380963303433
    [149] => 380974393339
    [150] => 380678677767
    [151] => 380967277787
    [152] => 380967279757
    [153] => 380677857677
    [154] => 380970292959
    [155] => 380970282228
    [156] => 380678656566
    [157] => 380980575737
    [158] => 380980757577
    [159] => 380980683858
    [160] => 380677907744
    [161] => 380966615566
    [162] => 380985590900
    [163] => 380678619991
    [164] => 380974422443
    [165] => 380963305500
    [166] => 380974455448
    [167] => 380980022551
    [168] => 380980022552
    [169] => 380963302200
    [170] => 380963381133
    [171] => 380974455411
    [172] => 380988558866
    [173] => 380988566688
    [174] => 380988566677
    [175] => 380988566699
    [176] => 380988558882
    [177] => 380988566606
    [178] => 380988444881
    [179] => 380969696337
    [180] => 380980808025
    [181] => 380980808034
    [182] => 380980011134
    [183] => 380970266616
    [184] => 380988777622
    [185] => 380974394448
    [186] => 380678149990
    [187] => 380678149991
    [188] => 380678149992
    [189] => 380678149993
    [190] => 380678149994
    [191] => 380678149995
    [192] => 380678149996
    [193] => 380979660096
    [194] => 380989897008
    [195] => 380987107111
    [196] => 380960742444
    [197] => 380989896995
    [198] => 380988860688
    [199] => 380978666689
    [200] => 380978666766
    [201] => 380501004414
    [202] => 380501811180
    [203] => 380958551234
    [204] => 380990309990
    [205] => 380666664515
    [206] => 380666663944
    [207] => 380666663233
    [208] => 380666665144
    [209] => 380666661494
    [210] => 380666662809
    [211] => 380666663415
    [212] => 380666662316
    [213] => 380666661414
    [214] => 380954815444
)

54 Востаннє редагувалося Vo_Vik (03.10.2012 06:22:56)

Re: Фільтрація номерів за маскою (задача на 5+)

"код для порівняння результатів"
<?
include 'list.php';
include 'funivan.php';
include 'bruteforce.php';
include 'smartforce.php';
include 'replace.php';
$maxLenght = 8;
$support_symbols = array(' ','+','-');
$list = explode("\n",str_replace($support_symbols,'',$list));
echo '<form action="match.php" method="post">';
echo 'Please enter mask (will be cat to '.$maxLenght.' symbols):<input type="text" name="mask" value="'.(isset($_POST['mask'])?$_POST['mask']:'').'">';
echo '</form>';
if(isset($_POST['mask']) && $_POST['mask']){
    $_POST['mask']=substr($_POST['mask'],0,$maxLenght);
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $starttime = $mtime;
//end check time
    $masks=getMasks($_POST['mask']);
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime = $mtime;
   $totaltime = ($endtime - $starttime);
   echo "Mask generation time =".$totaltime." seconds<br />";
//end check time
    $numbers = array();
    foreach($list as $number)
        foreach($masks as $mask)
                    if (strstr($number,$mask)) {
                        $numbers[] = str_replace($mask,('<b>'.$mask.'</b>'),$number);
                        break(1);
                    }
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime2 = $mtime;
   $totaltime = ($endtime2 - $endtime);
   echo "Mask comparation time =".$totaltime." seconds<br />";
//end check time

$validPhones = PhonesFinder::findByMask($_POST['mask'], $list);
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime3 = $mtime;
   $totaltime = ($endtime3 - $endtime2);
   echo "funivan time =".$totaltime." seconds<br />";
//end check time
$phones = new phones();
$goodPhones = $phones->getPhonesByMask($_POST['mask'], $list);
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime4 = $mtime;
   $totaltime = ($endtime4 - $endtime3);
   echo "smart time =".$totaltime." seconds<br />";
//end check time
    $numbersReplace = array();
    foreach($list as $number)
        if (pattern_match($number,$_POST['mask'])) {
            $numbersReplace[] = $number;
        }
//check time
   $mtime = microtime();
   $mtime = explode(" ",$mtime);
   $mtime = $mtime[1] + $mtime[0];
   $endtime5 = $mtime;
   $totaltime = ($endtime5 - $endtime4);
   echo "Replace time =".$totaltime." seconds<br />";
//end check time
    echo "Total selected ".count($numbers)." numbers<br />";
    echo "Total selected funivan ".count($validPhones)." numbers<br />";
    echo "Total selected smart ".count($goodPhones)." numbers<br />";
    echo "Total selected replace ".count($numbersReplace)." numbers<br />";
    echo "Mask: ".$_POST['mask'];
    echo "<table><tr>";
    echo "<td><pre>".print_r($numbers,true)."</pre></td>";
    echo "<td><pre>".print_r($validPhones,true)."</pre></td>";
    echo "<td><pre>".print_r($goodPhones,true)."</pre></td>";
    echo "<td><pre>".print_r($numbersReplace,true)."</pre></td>";
    echo "</tr></table>";
}
?>
"Сам функціонал"
<?
class Phones {
    private $numericMasks;
    private $letterMasks;
    private $maskLength;
    private function resetNumericMasks() {
        $this->numericMasks = array();
    }
    private function resetLetterMasks() {
        $this->letterMasks = array();
    }
    private function addNumericMask($number,$position) {
        $this->numericMasks[] = array('number'=>$number,'position'=>$position);
    }
    private function addLetterMask($letter,$position) {
        $this->letterMasks[$letter]['is'][] = $position;
    }
    private function normalizeLetterMask() {
        foreach($this->letterMasks as $letter1=>$letterArray1)
            foreach($this->letterMasks as $letter2=>$letterArray2)
                if($letter1!=$letter2)
                    foreach ($letterArray2['is'] as $position)
                        $this->letterMasks[$letter1]['not'][] = $position;
    }
    private function analizeMask($mask) {
        $this->resetNumericMasks();
        $this->resetLetterMasks();
        $mask = str_split($mask);
        $this->maskLength=count($mask);
        foreach($mask as $position=>$char) {
            if(is_numeric($char)) $this->addNumericMask($char,$position);
            else $this->addLetterMask($char,$position);
        }
        $this-> normalizeLetterMask();
    }
    private function checkNumber($number) {
        for($i=0;$i<=(strlen($number)-$this->maskLength);$i++){
            //check numeric masks
            foreach($this->numericMasks as $mask)
            {
                if(substr($number,$i+$mask['position'],1)!=$mask['number']) continue(2);
            }
            //check letter mask
            foreach($this->letterMasks as $mask) {
                $char = substr($number,$i+$mask['is'][0],1);
                foreach($mask['is'] as $position)
                    if($position!=$mask['is'][0] &&
                        substr($number,$i+$position,1)!=$char) continue(3);
                foreach($mask['not'] as $position)
                    if(substr($number,$i+$position,1)==$char) continue(3);
            }
            $goodNumber = $i;
            break(1);
        }
        if(isset($goodNumber)) 
            return substr($number,0,$goodNumber).'<b>'.
                        substr($number,$goodNumber,$this->maskLength).'</b>'.
                        substr($number,$goodNumber+$this->maskLength);
        else return false;
    }
    public function getPhonesByMask ($mask, $numbers) {
        $this->analizeMask($mask);
        $goodNumbers = array();
        foreach($numbers as $number) 
            if ($number = $this->checkNumber($number)) $goodNumbers[]=$number;
        return $goodNumbers;
    }
}
?>

55

Re: Фільтрація номерів за маскою (задача на 5+)

Впринципі бачу можливість ще для одної оптимізації, але то вже завтра... На нині хватить і так засидівся.

56 Востаннє редагувалося funivan (03.10.2012 12:25:37)

Re: Фільтрація номерів за маскою (задача на 5+)

У мене теж новий оптимізований код =) Від тепер прошу тестити його ;)

Є одна фішка.
Якщо наприклад є маска 69a тоді під цю умову попадають номери типу 696, 699 691
і так далі. Цей код оптимізований так, що для того що б уникнути цієї штуки достатньо пересунути одну умову на один рівень нижче. Якщо треба покажу ;)

class PhonesFinder {

  public static function findByMask($mask, $phones) {
    if (!preg_match('!^([a-z0-9]+)$!', $mask)) {
      throw new Exception('Mask not valid. [a-z] and [0-9] only');
    }

    if (empty($phones)) {
      return array();
    }

    $parrentsArray      = str_split($mask);
    $alphabeticPatterns = array();

    # prepare mask for regex
    foreach ($parrentsArray as $maskCharIndex => $maskChar) {

      if (preg_match('!^([0-9])$!', $maskChar)) {
        # is number
        $parrentsArray[$maskCharIndex] = '(' . $maskChar . ')';
      } else {
        # is letter
        $notPrevious = '';
        if (!empty($alphabeticPatterns)) {
          foreach ($alphabeticPatterns as $subpatternIndex) {
            $notPrevious.='(?!\\' . $subpatternIndex . ')';
          }
        }
        $subPattern = '(' . $notPrevious . '[0-9])';

        if (isset($alphabeticPatterns[$maskChar])) {
          $parrentsArray[$maskCharIndex] = '(\\' . $alphabeticPatterns[$maskChar] . ')';
        } else {
          $parrentsArray[$maskCharIndex] = $subPattern;
        }
        if (!isset($alphabeticPatterns[$maskChar])) {
          $alphabeticPatterns[$maskChar] = count($alphabeticPatterns) + 1;
        }
      }
      
    }
    
    $pattern     = '/' . implode('', $parrentsArray) . '/U';
    #mask is ready validate phones
    
    $phones      = (array) $phones;
    foreach ($phones as $i=>$phone) {
      $phone = preg_replace('![^0-9]!', '', $phone);
      if (preg_match($pattern, $phone, $match)) {
        //$phone         = str_replace($match[0], '<b>' . $match[0] . '</b>', $phone);
        $phones[$i] = $phone;
      }else{
        unset($phones[$i]);
      }
    }

    return $phones;
  }

}

Використовуємо так:

$mask           = 'aba';
$phones = array(
'+38 066666 45 15',
'+38 066666 39 44',
);
$validPhones = PhonesFinder::findByMask($mask, $phones);
echo '<pre>' . __LINE__ . '***' . print_r($validPhones, true) . '</pre>';

57

Re: Фільтрація номерів за маскою (задача на 5+)

function byMask2($number, $pattern) {
          //Конвертуємо маску в регексп
           $stack = array();
           $regExp = "#";
           foreach(str_split($pattern) as $symbol){
            if(in_array($symbol, $stack)){
              $regExp .= '\\'.(array_search($symbol, $stack)+1);
            } else {
              $regExp .= '([0-9])';
              $stack[] = $symbol;
            }
          }
   $regExp .= "#";
   preg_match_all($regExp, $number, $matches);
   foreach($matches[0] as $possibility){
       foreach(str_split($pattern) as $i=>$symbol){
           $result = true;
           if(count(array_keys(str_split($pattern), $symbol))>1){
               continue;
           } else if(count(array_keys(str_split($possibility), $possibility[$i])) == 1){
               continue;
           } else {
               $result = false;
               break;
           }
       }
   }
   return (isset($result)) ? $result : false;
            
 }
if(byMask2("1234552", "abcdeeb")){
    echo "here";
}

Перевірте цей варіант.

58

Re: Фільтрація номерів за маскою (задача на 5+)

Є одна фішка.
Якщо наприклад є маска 69a тоді під цю умову попадають номери типу 696, 699 691

У мене теж так.
Трохи пізніше, вечероком, як буду мати час, то протещу всі оптимізовані варіанти)

Оце провіряли? Бо я ще на вашому оптимізованому не дивився.

Mask: abcda

у funivan пропущений телефон [150] => 380666662316

59

Re: Фільтрація номерів за маскою (задача на 5+)

Patron, мені видає помилку у цьому рядку.

 Parse error: syntax error, unexpected '[' in /web/us4/patron.php on line 22
} else if(count(array_keys(str_split($possibility), str_split($possibility)[$i])) == 1){

60

Re: Фільтрація номерів за маскою (задача на 5+)

якщо його записати так:

 } else if(count(array_keys(str_split($possibility), $possibility[$i])) == 1){

То результати такі:

Прихований текст

funivan time =0.0138430595398 seconds
smart time =0.0695581436157 seconds
Patron time =0.106726884842 seconds
Total selected funivan 152 numbers
Total selected smart 152 numbers
Total selected patron 100 numbers
Mask: abcda

"Набори Номерів"

Array
(
    [8] => 0679093111
    [13] => 0675961717
    [17] => 0679093335
    [23] => 380934379999
    [24] => 380638347777
    [25] => 380639916666
    [26] => 380931293333
    [27] => 380638873333
    [28] => 380931172222
    [29] => 380935182222
    [31] => 380931177717
    [32] => 380931177776
    [33] => 380931177775
    [34] => 380931177774
    [35] => 380638800777
    [36] => 380931177333
    [37] => 380931177799
    [39] => 380931172233
    [40] => 380634131131
    [41] => 380636227227
    [42] => 380634119411
    [43] => 380639909903
    [44] => 380931288889
    [46] => 380638492000
    [47] => 380931293000
    [48] => 380633709111
    [49] => 380938566111
    [50] => 380635884111
    [51] => 380938106111
    [52] => 380634306111
    [53] => 380931566111
    [54] => 380938155222
    [55] => 380938106222
    [56] => 380938566222
    [57] => 380634331222
    [58] => 380634306222
    [59] => 380931576333
    [60] => 380634219333
    [61] => 380637230333
    [62] => 380636168333
    [63] => 380634101333
    [64] => 380634219444
    [65] => 380931576444
    [66] => 380938045444
    [67] => 380639902444
    [68] => 380934391555
    [69] => 380934124555
    [70] => 380639902555
    [71] => 380935781666
    [72] => 380935137666
    [73] => 380938069666
    [74] => 380636224666
    [75] => 380632775666
    [76] => 380931580666
    [77] => 380638373666
    [78] => 380931575666
    [79] => 380936572777
    [80] => 380938549777
    [81] => 380938549888
    [82] => 380636184888
    [83] => 380938565888
    [84] => 380931565888
    [85] => 380931575888
    [86] => 380635883999
    [87] => 380935137999
    [88] => 380637878999
    [89] => 380931292999
    [91] => 380935182020
    [92] => 380638405151
    [93] => 380637879494
    [94] => 380931172727
    [96] => 380633709070
    [97] => 380639909911
    [98] => 380639909696
    [99] => 380639909797
    [100] => 380639909799
    [101] => 380639909699
    [102] => 380938550003
    [103] => 380938550044
    [104] => 380634331166
    [105] => 380634331188
    [106] => 380634331199
    [107] => 380637878989
    [108] => 380639909919
    [109] => 380639909959
    [111] => 380931288828
    [112] => 380936556665
    [113] => 380639912424
    [114] => 380938583131
    [115] => 380938584242
    [116] => 380636084545
    [117] => 380633134646
    [118] => 380938584848
    [119] => 380938585353
    [120] => 380938586363
    [121] => 380639916767
    [122] => 380639916868
    [123] => 380636227474
    [124] => 380636207979
    [125] => 380636228181
    [126] => 380636228787
    [127] => 380637879009
    [128] => 380639912340
    [130] => 380638455544
    [131] => 380638455505
    [133] => 380639912299
    [134] => 380639915533
    [135] => 380639915500
    [136] => 380639916600
    [137] => 380634546611
    [138] => 380634546655
    [139] => 380639916688
    [140] => 380634546677
    [142] => 380639911880
    [143] => 380936556766
    [144] => 380639911616
    [146] => 380938069699
    [147] => 380639909899
    [148] => 380639909930
    [150] => 380639909960
    [151] => 380639909917
    [152] => 380639909934
    [153] => 380639909932
    [154] => 380639909940
    [155] => 380639909941
    [156] => 380639909947
    [157] => 380639909948
    [158] => 380639909951
    [159] => 380639909952
    [160] => 380639909915
    [163] => 380981728000
    [174] => 380678698555
    [176] => 380678619666
    [178] => 380970292888
    [198] => 380974393339
    [199] => 380678677767
    [203] => 380970292959
    [205] => 380678656566
    [219] => 380678619991
    [260] => 380974394448
    [265] => 380678149990
    [266] => 380678149991
    [267] => 380678149992
    [268] => 380678149993
    [269] => 380678149994
    [270] => 380678149995
    [271] => 380678149996
    [286] => 380978666689
    [287] => 380978666766
    [291] => 380958551234
    [302] => 380666662316
    [308] => 380954815444
)

   

Array
(
    [0] => 0679093111
    [1] => 0675961717
    [2] => 0679093335
    [3] => 380934379999
    [4] => 380638347777
    [5] => 380639916666
    [6] => 380931293333
    [7] => 380638873333
    [8] => 380931172222
    [9] => 380935182222
    [10] => 380931177717
    [11] => 380931177776
    [12] => 380931177775
    [13] => 380931177774
    [14] => 380638800777
    [15] => 380931177333
    [16] => 380931177799
    [17] => 380931172233
    [18] => 380634131131
    [19] => 380636227227
    [20] => 380634119411
    [21] => 380639909903
    [22] => 380931288889
    [23] => 380638492000
    [24] => 380931293000
    [25] => 380633709111
    [26] => 380938566111
    [27] => 380635884111
    [28] => 380938106111
    [29] => 380634306111
    [30] => 380931566111
    [31] => 380938155222
    [32] => 380938106222
    [33] => 380938566222
    [34] => 380634331222
    [35] => 380634306222
    [36] => 380931576333
    [37] => 380634219333
    [38] => 380637230333
    [39] => 380636168333
    [40] => 380634101333
    [41] => 380634219444
    [42] => 380931576444
    [43] => 380938045444
    [44] => 380639902444
    [45] => 380934391555
    [46] => 380934124555
    [47] => 380639902555
    [48] => 380935781666
    [49] => 380935137666
    [50] => 380938069666
    [51] => 380636224666
    [52] => 380632775666
    [53] => 380931580666
    [54] => 380638373666
    [55] => 380931575666
    [56] => 380936572777
    [57] => 380938549777
    [58] => 380938549888
    [59] => 380636184888
    [60] => 380938565888
    [61] => 380931565888
    [62] => 380931575888
    [63] => 380635883999
    [64] => 380935137999
    [65] => 380637878999
    [66] => 380931292999
    [67] => 380935182020
    [68] => 380638405151
    [69] => 380637879494
    [70] => 380931172727
    [71] => 380633709070
    [72] => 380639909911
    [73] => 380639909696
    [74] => 380639909797
    [75] => 380639909799
    [76] => 380639909699
    [77] => 380938550003
    [78] => 380938550044
    [79] => 380634331166
    [80] => 380634331188
    [81] => 380634331199
    [82] => 380637878989
    [83] => 380639909919
    [84] => 380639909959
    [85] => 380931288828
    [86] => 380936556665
    [87] => 380639912424
    [88] => 380938583131
    [89] => 380938584242
    [90] => 380636084545
    [91] => 380633134646
    [92] => 380938584848
    [93] => 380938585353
    [94] => 380938586363
    [95] => 380639916767
    [96] => 380639916868
    [97] => 380636227474
    [98] => 380636207979
    [99] => 380636228181
    [100] => 380636228787
    [101] => 380637879009
    [102] => 380639912340
    [103] => 380638455544
    [104] => 380638455505
    [105] => 380639912299
    [106] => 380639915533
    [107] => 380639915500
    [108] => 380639916600
    [109] => 380634546611
    [110] => 380634546655
    [111] => 380639916688
    [112] => 380634546677
    [113] => 380639911880
    [114] => 380936556766
    [115] => 380639911616
    [116] => 380938069699
    [117] => 380639909899
    [118] => 380639909930
    [119] => 380639909960
    [120] => 380639909917
    [121] => 380639909934
    [122] => 380639909932
    [123] => 380639909940
    [124] => 380639909941
    [125] => 380639909947
    [126] => 380639909948
    [127] => 380639909951
    [128] => 380639909952
    [129] => 380639909915
    [130] => 380981728000
    [131] => 380678698555
    [132] => 380678619666
    [133] => 380970292888
    [134] => 380974393339
    [135] => 380678677767
    [136] => 380970292959
    [137] => 380678656566
    [138] => 380678619991
    [139] => 380974394448
    [140] => 380678149990
    [141] => 380678149991
    [142] => 380678149992
    [143] => 380678149993
    [144] => 380678149994
    [145] => 380678149995
    [146] => 380678149996
    [147] => 380978666689
    [148] => 380978666766
    [149] => 380958551234
    [150] => 380666662316
    [151] => 380954815444
)

   

Array
(
    [0] => 0679093111
    [1] => 0675961717
    [2] => 0679093335
    [3] => 380934379999
    [4] => 380638347777
    [5] => 380639916666
    [6] => 380931293333
    [7] => 380638873333
    [8] => 380931172222
    [9] => 380935182222
    [10] => 380931177776
    [11] => 380931177775
    [12] => 380931177774
    [13] => 380638800777
    [14] => 380931177333
    [15] => 380931177799
    [16] => 380931172233
    [17] => 380634131131
    [18] => 380931288889
    [19] => 380638492000
    [20] => 380931293000
    [21] => 380633709111
    [22] => 380938566111
    [23] => 380635884111
    [24] => 380634306111
    [25] => 380938155222
    [26] => 380938106222
    [27] => 380938566222
    [28] => 380634331222
    [29] => 380634306222
    [30] => 380931576333
    [31] => 380634219333
    [32] => 380636168333
    [33] => 380634101333
    [34] => 380634219444
    [35] => 380931576444
    [36] => 380639902444
    [37] => 380934391555
    [38] => 380934124555
    [39] => 380639902555
    [40] => 380935781666
    [41] => 380935137666
    [42] => 380632775666
    [43] => 380931580666
    [44] => 380638373666
    [45] => 380931575666
    [46] => 380938549777
    [47] => 380938549888
    [48] => 380931565888
    [49] => 380931575888
    [50] => 380635883999
    [51] => 380935137999
    [52] => 380637878999
    [53] => 380935182020
    [54] => 380638405151
    [55] => 380637879494
    [56] => 380938550003
    [57] => 380938550044
    [58] => 380634331166
    [59] => 380634331188
    [60] => 380634331199
    [61] => 380639912424
    [62] => 380938583131
    [63] => 380938584242
    [64] => 380636084545
    [65] => 380633134646
    [66] => 380938586363
    [67] => 380639916767
    [68] => 380639916868
    [69] => 380636227474
    [70] => 380636207979
    [71] => 380636228181
    [72] => 380636228787
    [73] => 380637879009
    [74] => 380639912340
    [75] => 380639915533
    [76] => 380639915500
    [77] => 380639916600
    [78] => 380634546611
    [79] => 380639916688
    [80] => 380634546677
    [81] => 380639911880
    [82] => 380936556766
    [83] => 380639911616
    [84] => 380938069699
    [85] => 380981728000
    [86] => 380678698555
    [87] => 380970292888
    [88] => 380974393339
    [89] => 380970292959
    [90] => 380974394448
    [91] => 380678149990
    [92] => 380678149991
    [93] => 380678149992
    [94] => 380678149993
    [95] => 380678149995
    [96] => 380678149996
    [97] => 380978666689
    [98] => 380958551234
    [99] => 380954815444
)