индикатор выполнения — проблемы PHP с блоком отправки и работы функций друг другу.

Это проблема у меня с кодом:

  1. У меня есть функция, которая создает панель обновления;
  2. У меня есть функция, которая создает цикл, каждый номер цикла делает некоторые другие вещи, и это же число представляет прогресс бара (от 1 до 155);
  3. этот цикл работает, когда пользователь выполняет «поиск» на сайте по «всем» странам;
  4. НО пользователь также может сделать «поиск», выбирая только 1-5 разных стран;
  5. таким образом, у нас есть функция, которая делает PROGRESS BAR, еще одна, которая делает PROGRESS PART частью BAR, которая должна понимать, как прогрессировать.

Итак, дело в том, что я не знаю, как заставить функцию индикатора выполнения интерпретировать ситуацию, чтобы знать, что пользователь выбрал только некоторые страны, а не «все» страны (опция будет публиковать в функции некоторые «числа loop «like» 3 «,» 4 «,» 56 «… соответствует выбранной стране) — и это простая часть (возможно, isset ($ var)).

Следующая сложная часть заключается в том, что после этого она будет называться функцией PROGRESS BAR с этими «номерами стран», так что если вы выберете «Канада-США-Франция», числа будут «34-12-45» и индикатор выполнения напишет «34% -12% -45%».
Но это неверно, потому что если у вас есть 3 варианта, это должно быть 33% -66% -99% (а не 34% -12% -45%) …

Чего я не знаю, так это как заставить эту функцию понять, что каждый раз, когда функция получает «номер страны», и это зависит от выбора пользователя, отличного от «всего», функция должна получить это число и изменить его (и это может должно быть сделано с массивом), чтобы адаптировать его к правильной последовательности баров, так что если у вас есть: 34, а не 12, а 45, функция должна понимать, что 1-й раз 34 должен стать 33, 2-й раз 12 должен стать 66 и в третий раз 45 должно стать 99 (или 100) …

Вот часть кода, представляющая интерес:

1. получить _POST и проверить его:

   function getData() {
$a = strtolower($_POST["CountryOne"]);
$b = strtolower($_POST["CountryTwo"]);
$c = strtolower($_POST["CountryThree"]);
$d = strtolower($_POST["CountryFour"]);
$d = strtolower($_POST["CountryFive"]);

$numPost = count($_POST);
if ($numPost == 0) {
echo("<p class='Verify'>Select an option to start search...<br></p>");
} else {
echo "<div class='Verify' id='progressbar' style='width:620px;height:16px'></div>
<div class='VerifyBar' id='information' style='width'></div>";
};

2. Перейдите к следующей части после проверки, что пользователь выбрал «все» или «некоторые страны» — вот цикл:

  function loopNum($x) {
$i = 0+$x;
$y = $x+3;
for ($x = $i; $x <= $y; $x++) {
$iscountryID = ("$country".$x."");
createUrl($iscountryID);
} if($y != 155) {
return loopNum($x);
} else if($y < 155) {
echo("<font size='2' face='Tahoma, Geneva, sans-serif' style='font-variant: small-caps' color='#FF0000'><i>ERROR: unxepected data extraction interruption</font></i><br>");
} else {
echo("<font size='2' face='Tahoma, Geneva, sans-serif' style='font-variant: small-caps' color='#00CC00'><i>FINISHED: data extraction ended</font></i><br>");
}};

3. чем он делает много других вещей и вызывает функцию индикатора выполнения

 function completeBar($iscountryID) {

//***** PART UNDER CONSTRUCTION WHERE I NEED HELP *****
$countryOne = strtolower($_POST["CountryOne"]);
$countryTwo = strtolower($_POST["CountryTwo"]);
$countryThree = strtolower($_POST["CountryThree"]);
$countryFour = strtolower($_POST["CountryFour"]);
$countryFive = strtolower($_POST["CountryFive"]);

if (($countryOne !== 'all') and ($countryTwo !== 'all') and ($countryThree !== 'all') and ($countryFour !== 'all') and ($countryFive !== 'all')) {

$numQuery = array("$countryOne","$countryTwo","$countryThree","$countryFour","$countryFive");

foreach ($numQuery as $value) {
if(is_numeric($value)) {
$j++;
}}; // AT THIS POINT I WOULD KNOW HOW MANY VALUES IN THE ARREY ARE DIFFERENT FROM "ALL" AND "NO_COUNTRY" OPTIONS AND SO ARE NUMERIC VALUES

//***** FROM HERE I DUNNO HOW TO PRECEED *****

} else { //the next part works with "all" option choosed
if ($iscountryID < 155) {
$i = $iscountryID;

$percent = $i."%";
$pxbar = 4*$i."px";

$percentage = round((($pxbar*100)/624),0); //bar is 624px long

// Javascript for updating the progress bar and information
echo '<script language="javascript">
document.getElementById("progressbar").innerHTML="<div style=\"width:'.$pxbar.';background-color:#ddd;\">'.$percentage.'%&nbsp;</div>";
document.getElementById("information").innerHTML="'.$i.'/155 country(s) processed... loading your data, hold on..."</script>';

// This is for the buffer achieve the minimum size in order to flush data
echo str_repeat(' ',1024*64);

// Send output to browser immediately
flush();
sleep(1);
} else if ($iscountryID == 155) { //so on loop complete
$i = $iscountryID;
$percent = $i."%";
$pxbar = 4*$i."px";
$percentage = round((($pxbar*100)/624),0);

echo '<script language="javascript">
document.getElementById("progressbar").innerHTML="<div style=\"width:'.$pxbar.';background-color:#ddd;\">'.$percentage.'%&nbsp;</div>";
document.getElementById("information").innerHTML="'.$i.'/155 country(s) processed... loading your data, hold on..."</script>';

echo str_repeat(' ',1024*64);
flush();
sleep(1);
// Tell user that the process is completed
echo '<script language="javascript">
document.getElementById("progressbar").innerHTML="<div style=\"width:'.$pxbar.';background-color:#ddd;\">100%&nbsp;</div>";
document.getElementById("information").innerHTML="<div>Process completed, all countries verified...</div>";

document.getElementById("information").style.color="green";
</script>';
echo str_repeat(' ',1024*64);
flush();
sleep(1);
}
}};

Ах … Я пытался заставить следующее работать, но проблема в том, что со следующим у меня будет функция, обновляющая бар, получающая значения из массива слишком быстро. Используя VAR, отправленный из остальной части файла, у меня будет строка обновления, которая следует за обновлением вывода сервера.

 function partialBar() {
$countryOne = strtolower($_POST["CountryOne"]);
$countryTwo = strtolower($_POST["CountryTwo"]);
$countryThree = strtolower($_POST["CountryThree"]);
$countryFour = strtolower($_POST["CountryFour"]);
$countryFive = strtolower($_POST["CountryFive"]);

$numQuery = array("$countryOne","$countryTwo","$countryThree","$countryFour","$countryFive");

foreach ($numQuery as $value) {
if(is_numeric($value)) {
$j++;
};
};

if ($j == 1) {
$iscountryID = 155;
completeBar($iscountryID);
} else if ($j == 2) {
$iscountryID = array("78","155");
completeBar($iscountryID[0]);
completeBar($iscountryID[1]);
} else if ($j == 3) {
$iscountryID = array("52","104","155");
completeBar($iscountryID[0]);
completeBar($iscountryID[1]);
completeBar($iscountryID[2]);
} else if ($j == 4) {
$iscountryID = array("39","78","117","155");
completeBar($iscountryID[0]);
completeBar($iscountryID[1]);
completeBar($iscountryID[2]);
completeBar($iscountryID[3]);
} else if ($j == 5) {
$iscountryID = array("31","62","93","124","155"); //these numbers are the corresponding loop number in other to get 20%-40%-60%-80%-100% from the completeBar() function
completeBar($iscountryID[0]);
completeBar($iscountryID[1]);
completeBar($iscountryID[2]);
completeBar($iscountryID[3]);
completeBar($iscountryID[4]);
} else echo ("<div class='Verify'>Something went wrong!</div>");
};

0

Решение

Вот решение:

сделайте счетчик в центральной функции, чтобы узнать, сколько раз было вызвано, чтобы вы знали, какой номер массива вы должны вызвать для правильного вычисления% индикатора выполнения.

Здесь вызываются следующие функции:

 if (($countryNameTitOne == 'all') or ($countryNameTitTwo == 'all')
or ($countryNameTitThree == 'all') or ($countryNameTitFour == 'all')
or ($countryNameTitFive == 'all')) {
completeBar($iscountryID);
} else {
$callCounter = callCounterFunc();
partialbar($iscountryID,$callCounter);
}};

Затем здесь называются функции:

 function completeBar($iscountryID) {
if ($iscountryID < 155) {
$i = $iscountryID;

$percent = $i."%";
$pxbar = 4*$i."px";
$percentage = round((($pxbar*100)/624),0);
echo '<script language="javascript">
document.getElementById("progressbar").innerHTML="<div style=\"width:'.$pxbar.';background-color:#ddd;\">'.$percentage.'%&nbsp;</div>";
document.getElementById("information").innerHTML="'.$i.'/155 country(s) processed... loading your data, hold on..."</script>';
echo str_repeat(' ',1024*64);
flush();
sleep(1);
} else if ($iscountryID == 155) {
$i = $iscountryID;
$percent = $i."%";
$pxbar = 4*$i."px";
$percentage = round((($pxbar*100)/624),0);
echo '<script language="javascript">
document.getElementById("progressbar").innerHTML="<div style=\"width:'.$pxbar.';background-color:#ddd;\">'.$percentage.'%&nbsp;</div>";
document.getElementById("information").innerHTML="'.$i.'/155 country(s) processed... loading your data, hold on..."</script>';
echo str_repeat(' ',1024*64);
flush();
sleep(1);
echo '<script language="javascript">
document.getElementById("progressbar").innerHTML="<div style=\"width:'.$pxbar.';background-color:#ddd;\">100%&nbsp;</div>";
document.getElementById("information").innerHTML="<div>Process completed, all countries verified...</div>";

document.getElementById("information").style.color="green";
</script>';

echo str_repeat(' ',1024*64);
flush();
sleep(1);
}
};


function partialBar($iscountryID,$callCounter) {

$countryOne = strtolower($_POST["CountryOne"]);
$countryTwo = strtolower($_POST["CountryTwo"]);
$countryThree = strtolower($_POST["CountryThree"]);
$countryFour = strtolower($_POST["CountryFour"]);
$countryFive = strtolower($_POST["CountryFive"]);

$numQuery = array("$countryOne","$countryTwo","$countryThree","$countryFour","$countryFive");

foreach ($numQuery as $value) {
if(is_numeric($value)) {
$j++;
}};

if ($j == 1) {
if ($callCounter == 1) {
$iscountryID = 155;
completeBar($iscountryID);
};
} else if ($j == 2) {
$iscountryID = array("78","155");
if ($callCounter == 1) {
completeBar($iscountryID[0]);
} else if ($callCounter == 2) {
completeBar($iscountryID[1]);
};
} else if ($j == 3) {
$iscountryID = array("52","104","155");
if ($callCounter == 1) {
completeBar($iscountryID[0]);
} else if ($callCounter == 2) {
completeBar($iscountryID[1]);
} else if ($callCounter == 3) {
completeBar($iscountryID[2]);
};
} else if ($j == 4) {
$iscountryID = array("39","78","117","155");
if ($callCounter == 1) {
completeBar($iscountryID[0]);
} else if ($callCounter == 2) {
completeBar($iscountryID[1]);
} else if ($callCounter == 3) {
completeBar($iscountryID[2]);
} else if ($callCounter == 4) {
completeBar($iscountryID[3]);
};
} else if ($j == 5) {
$iscountryID = array("31","62","93","124","155");
if ($callCounter == 1) {
completeBar($iscountryID[0]);
} else if ($callCounter == 2) {
completeBar($iscountryID[1]);
} else if ($callCounter == 3) {
completeBar($iscountryID[2]);
} else if ($callCounter == 4) {
completeBar($iscountryID[3]);
} else if ($callCounter == 5) {
completeBar($iscountryID[4]);
};
} else echo ("<div class='Verify'>Something went wrong!</div>");
};

function callCounterFunc() {
static $calls = 0;
++$calls;
return $calls;
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]