Проблема в разработке 2 алгоритмов
1) Вывод навигации
Вообщем так-то сложностей никаких нет, но есть одно НО. Выводятся не все страницы, а только определееное число, остальное опускается. Ну например как на этом форуме исталка страниц.
Код:
/** string BuildNavigation($sumOfEntries,$entriesPerPage,$startEntry,$unitsInNavbar,$tpl,$params=2);
* Возврщает постороенную строку из ссылок
* return: string
*/
function BuildNavigation($sumOfEntries,$entriesPerPage,$startEntry,$unitsInNavbar,$tpl,$params=2) {
/**============================================
* integer $sumOfEntries - количество всех записей
* integer $entriesPerPage - записей на странице
* integer $startEntry - с какой записи начинается станица
* integer $unitsInNavbar - кол-во ссылок для листалки ( если равно 2, то выводится все)
* array $tpl = array(
* ['first_page'] - шаблон для ссылки на первую страницу,
* ['last_page'] - шаблон для ссылки на последнюю страницу,
* ['link'] - шаблон для ссылок,
* ['current'] - шаблон для текущей страницы,
* ['delimiter'] - шаблон для разделителя ссылок
* );
* integer $params = параметры вывода данных
**============================================*/
$countUnits = ceil($sumOfEntries/$entriesPerPage); // суммарное кол-во страниц
$currentUnit = floor(($startEntry/$entriesPerPage)/$unitsInNavbar); // текущая страница
// здесь вся загвоздка
#$startUnit = $currentUnit
$endUnit = $startUnit + $unitsInNavbar;
}
* Возврщает постороенную строку из ссылок
* return: string
*/
function BuildNavigation($sumOfEntries,$entriesPerPage,$startEntry,$unitsInNavbar,$tpl,$params=2) {
/**============================================
* integer $sumOfEntries - количество всех записей
* integer $entriesPerPage - записей на странице
* integer $startEntry - с какой записи начинается станица
* integer $unitsInNavbar - кол-во ссылок для листалки ( если равно 2, то выводится все)
* array $tpl = array(
* ['first_page'] - шаблон для ссылки на первую страницу,
* ['last_page'] - шаблон для ссылки на последнюю страницу,
* ['link'] - шаблон для ссылок,
* ['current'] - шаблон для текущей страницы,
* ['delimiter'] - шаблон для разделителя ссылок
* );
* integer $params = параметры вывода данных
**============================================*/
$countUnits = ceil($sumOfEntries/$entriesPerPage); // суммарное кол-во страниц
$currentUnit = floor(($startEntry/$entriesPerPage)/$unitsInNavbar); // текущая страница
// здесь вся загвоздка
#$startUnit = $currentUnit
$endUnit = $startUnit + $unitsInNavbar;
}
надо вычислить юнит(ссылка), с которого будет начинаться листалка. Вот. И никак не могу сообразить алгоритм. Так как если делать в лоб (т.е. перебирать циклом, прибавлять кол-во юнитов справа или слева) тогда возникает много условностей. Думаю, есть какой-то алгоритм, но чето я так и не сообразил...
Просьба кто знает алгоритм - напишите немного, собъяснением)
2) входит integer число, которое является суммой значений параметров. Разбить сумму и найти исходные числа
Криво наверно описал в названии, поэтому стоит привести пример:
[QUOTE="Пример"]
ряд чисел:1,2,4,8,16,32,64,...
сумма любых чисел из ряда всегда уникальна. думаю многие знают такое)
вот допустим каждому числу присваивается свой параметр. в функцию принимается сумма чисел. т.е. несколько int параметров суммируются и передаются. в функции эта сумма парсится, и в итоге узнается, какие параметры передаются.
для примера - права файлов в юниксах. (цифрами: 1,2,4. сумма парситься и соответствующие права выставляется)
или в php error_reporting($param); в $param можно передать:
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
[/QUOTE]
так вот не могу сообразить, каким алгоритмом пропарсить входящую сумму чисел:confused:
Код:
/**
* Проверяет, имеет ли пользователь необходимые права
*
* @param User $u
* @param int $role
* @return bool
*/
public static function isAccess(User $u, $role)
{
return ($u->_role !== null && ($u->_role | $role) == $u->_role);
}
* Проверяет, имеет ли пользователь необходимые права
*
* @param User $u
* @param int $role
* @return bool
*/
public static function isAccess(User $u, $role)
{
return ($u->_role !== null && ($u->_role | $role) == $u->_role);
}
По поводу первого... Возьми исходники любого форума и посмотри :)
По поводу второго, как я понял тебе нужно вот это...
Код:
<?php
// $p - сумма
// $k - степень двойки
// $n - временная переменаая
// $n=$n>>1 - целочисленное деление на 2
function pars($p){ //Функция которая собственно все делает, рекурсивная
if ($p%2==0){
$k=0;
$n=$p;
while($n%2==0){
$n=$n>>1;
$k++;
}
$chis=1;
for ($i=1; $i<=$k; $i++){
$chis=$chis*2;
}
echo "$chis<br>"; //Вот сдесь необходимо записать как то это число в массив $param, но почему то у меня функция его не видит, поэтому просто вывожу на экран
// А надо что то в виде $param[]=$chis, в итоге будет массив с числами, нулевой элемент которого есть сумма его элементов
$p=$p-$chis;
if ($p<>0){
pars($p);
}
}else{
echo "1<br>";
if (($p-1)%2==0){
pars($p-1);
}
}
}
//////////////////////////////////////////////////////////////////////////////
//// ФОРМА ОТПРАВКИ ЧИСЛА //////
//////////////////////////////////////////////////////////////////////////////
if (isset($_GET['send'])){
$param[0]=$_GET['num'];
pars($param[0]);
}else{
echo "
<form action='parsit.php' method=get>
<input type='text' name='num'>
<input type='submit' name='send' value='varificate'>
</form>
";
}
?>
// $p - сумма
// $k - степень двойки
// $n - временная переменаая
// $n=$n>>1 - целочисленное деление на 2
function pars($p){ //Функция которая собственно все делает, рекурсивная
if ($p%2==0){
$k=0;
$n=$p;
while($n%2==0){
$n=$n>>1;
$k++;
}
$chis=1;
for ($i=1; $i<=$k; $i++){
$chis=$chis*2;
}
echo "$chis<br>"; //Вот сдесь необходимо записать как то это число в массив $param, но почему то у меня функция его не видит, поэтому просто вывожу на экран
// А надо что то в виде $param[]=$chis, в итоге будет массив с числами, нулевой элемент которого есть сумма его элементов
$p=$p-$chis;
if ($p<>0){
pars($p);
}
}else{
echo "1<br>";
if (($p-1)%2==0){
pars($p-1);
}
}
}
//////////////////////////////////////////////////////////////////////////////
//// ФОРМА ОТПРАВКИ ЧИСЛА //////
//////////////////////////////////////////////////////////////////////////////
if (isset($_GET['send'])){
$param[0]=$_GET['num'];
pars($param[0]);
}else{
echo "
<form action='parsit.php' method=get>
<input type='text' name='num'>
<input type='submit' name='send' value='varificate'>
</form>
";
}
?>
Вот рабочий код, тупо залей в новый пхп файл и проверь :)
ап
Да тут я) Просто руки не дойдут сесть да проверить все это дело)
Ы, ну эт дело работает, тут тока надо как то из функции данные в массив записать) пока хз как это делать(
Код:
function parseIntegerSum($sum,&$Output) {
if($sum%2 == 0) {
//$k - степень двойки
// $n=$n>>1 - целочисленное деление на 2
for($k=0,$n=$sum; $n%2==0; $k++) $n=$n>>1;
$item = 1;
for($i=1;$i<=$k;$i++){
$item = $item*2;
}
array_push($Output,$item); // пихаем полученный ответ в массив
$sum = $sum-$item;
if($sum != 0) parseIntegerSum($sum,&$Output);
} else {
if( ($sum-1)%2 == 0 ) parseIntegerSum($sum-1,&$Output);
}
}
// используешь так:
$array = array();
parseIntegerSum(127,&$array);
// в $array будут все эти числа
if($sum%2 == 0) {
//$k - степень двойки
// $n=$n>>1 - целочисленное деление на 2
for($k=0,$n=$sum; $n%2==0; $k++) $n=$n>>1;
$item = 1;
for($i=1;$i<=$k;$i++){
$item = $item*2;
}
array_push($Output,$item); // пихаем полученный ответ в массив
$sum = $sum-$item;
if($sum != 0) parseIntegerSum($sum,&$Output);
} else {
if( ($sum-1)%2 == 0 ) parseIntegerSum($sum-1,&$Output);
}
}
// используешь так:
$array = array();
parseIntegerSum(127,&$array);
// в $array будут все эти числа
ООоо, UAS, спс, я терь знаю как не только в функцию вводить, но и выводить)))