2012-03-20 2 views
0

Итак ... У меня есть проблема с подсчетом всех совпадений preg_match и суммирования/добавления первых его частей (число до «/»). Я просто хочу получить среднее число чисел до «/». Очень жаль плохой английский.PHP count и sum preg_matches

script.php

$wyniki=file("wyniki.txt"); 
foreach($wyniki as $w) 
{ 
     preg_match("/^([0-9]{1})\/([0-9]{1})$/",$w,$ar); 
     if(!empty($ar)){ 
     print_r($ar[1].'/'.$ar[2]); 
     echo("\n"); 
     } 
} 

script2.php (потерпеть неудачу, но другой способ script.php)

$file=fopen("wyniki.txt", "r"); 
$read=fread($file, filesize("wyniki.txt")); 
echo($read."\n"); 
//if($read!=trim('')) 
//{ 
     preg_match("/^([0-9]{1})\/([0-9]{1})$/",$read,$ar); 
     //print_r($ar[1].'/'.$ar[2]); 
     print_r($ar); 
     echo("\n"); 
//} 
fclose($file); 

wyniki.txt

5/5 
asd 

4/5 
fgh 
+1

Подсказка: '[0-9] {1}' можно записать в виде '[0-9] 'в одиночку. Добавление '{1}' похоже на «яблоко яблоко». Класс символов уже будет соответствовать отдельной цифре. –

+0

Что вы здесь pb? Ваше регулярное выражение выглядит ОК (cf http://www.regexplanet.com/advanced/java/index.html) – haltabush

+0

Моя проблема здесь заключается в том, чтобы создать код для получения среднего значения. Все мои попытки даже с подсчетом $ ar не удалось;) – crusty

ответ

0

Ваше регулярное выражение кажется, нормально. Возможно, у вас есть пробелы в конце каждой строки (вы использовали «$»). Вы можете удалить их, используя trim(). Кроме того, регулярное выражение может быть не лучшим решением в каждом случае. Возможно, вам будет проще проверить наличие «/», затем использовать split() и проверить его, что массив [0] - это число (is_numeric()). Рассмотрим следующий код:

$wyniki=file("wyniki.txt"); 
foreach($wyniki as $w) { 
if (strpos($w, '/') !== FALSE) { 
    $tarr = split("\/", $w); 
    if (is_numeric($tarr[0])) 
    echo "This is a number: " . $tarr[0]; 
} 
} 

Второй код с регулярным выражением:

$flines = array("5/5","asd","4/5","fgh"); 
$regex = "#^([0-9]{1})\/([0-9]{1})$#"; 
$res = $tot = 0; 
foreach ($flines as $fline) { 
$arr = array(); 
preg_match($regex, $fline, $arr); 
if (is_numeric($arr[1])) { 
    $res += $arr[1]; 
    $tot++; 
} 
} 
$avg = bcdiv($res, $tot, 2); 
echo "Average: $avg"; 
+0

это правильно, но я до сих пор не знаю, как считать все вхождения;) А также как суммировать числа до /;) – crusty

+0

Я отредактировал свой код, который дает 4.5 правильно. Это предполагает, что все ваши номера за «/» равны. – Jan

+0

4.5? Да, цифры после '/' всегда равны 5, но до этого нет;) – crusty