$i = 0;
while ($have_something) {
if($i == 0 || $i == 3 || $i == 6 || $i == 9) {
$color = 'black';
}
else {
$color = 'white';
}
$i++;
}
Problem occurs with this code when count of items in while loop is dynamic and changes regulary, also when it could have hundreds of items which means that if statement would be very long.
How to overcome this problem and "automate" it so that something happens with every X item and something else for the rest without hardcoding $i count?
Use the modulus operator %:
$i = 0;
while ($have_something) {
if($i % 3 == 0 ) {
$color = 'black';
}
else {
$color = 'white';
}
$i++;
}
An alternative to using php to generate what I assume will be a class or inline color definition would be purely in css by using the nth-of-type(3n) style selector.
<style>
#rep{ width:80%; float:none; margin:5rem auto; box-sizing:border-box; padding:1rem; }
#rep div{ width:100%; float:none; margin:0.1rem auto; box-sixing:border-box; border:1px solid black; }
#rep div:nth-of-type(2n){ background:whitesmoke; }
#rep div:nth-of-type(3n){ background:gray; }
#rep div:nth-of-type(4n){ background: #f0ffff; }
#rep div:nth-of-type(5n){ background: #f0fff0; }
#rep div:nth-of-type(6n){ background: #e0ffff; }
#rep div:nth-of-type(7n){ background: #f0f8ff; }
#rep div:nth-of-type(8n){ background: #e6e6fa; }
#rep div:nth-of-type(9n){ background: #b0e0e6; }
</style>
echo "<div id='rep'>";
for( $i=0; $i < 30; $i++ ) echo "<div>$i</div>";
echo "</div>";
Anyway, just a thought!
or, a better css selector is nth-child perhaps
#rep div:nth-child(3n){background:black;}
if you are interested in this technique this would be a handy guide possibly
Related
I have developed a page that shows the details of user achievements. I have a table that holds the level of the user.
Users( id, username, password, sum_score, level)
Based on the value present in level(i.e., from 0 to 5) I would like to like to display stars in the user page.
I tried something like :
$stars = "";
$s = 1;
while ($s<=$lvl['level']) {
$stars.="★";
$s++;
}
echo "$stars";
The above code produces star based on the level.(i.e., if the level is 1 it shows one star on the page). But I want to display 5 stars and fill the stars based on the level in the table. Can Someone help me out.
Instead of using while, you can use a simple for loop in this case.
Assuming $lvl['level'] is properly getting database's data (i.e., 5), you can loop until 5 compare it with $lvl['level'] value, and display the star based on the if statement's result. Like so:
$stars = "";
for ($i = 1; $i <= 5; $i++) {
$i <= $lvl['level'] ? $stars .= "★" : $stars .= "☆";
}
echo $stars;
str_repeat is one option.
// stub for your record
$lvl = [
'level' => 4
];
// render
$maxStars = 5;
$stars = (int)$lvl['level'];
$output =
str_repeat('★', $stars) .
str_repeat('☆', $maxStars - $stars) .
' stars';
echo $output;
Output: https://3v4l.org/UFprQ
If you add some classes and holders and add one if statement in the loop
<?php
$lvl = ["id" => 1, "level" => 4];
$stars = "";
for ($i = 1; $i < 6; $i++) {
$stars .= '<span' . (($i <= $lvl["level"]) ? ' class="fill"' : '') . '>';
$stars .='★</span>';
}
echo '<div class="star"><div class="rating">' . $stars . '</div></div>';
Here is the snippet, HTML code is the output of the PHP:
.star {
width: 200px;
position: relative;
color: #bdbdbd;
}
.rating span {
font-size: 30px;
margin-left: -4px;
white-space: nowrap;
overflow: hidden;
}
.rating span:before {
content: "\2605";
position: absolute;
color: gray;
}
.rating span.fill:before {
content: "\2605";
position: absolute;
color: gold;
}
<!-- this will be the output generated from php code used above !-->
<div class="star">
<div class="rating"><span class="fill">★</span><span class="fill">★</span><span class="fill">★</span><span>★</span><span>★</span></div>
</div>
I would like to split stylesheet into arrays in a way that every selector is in separeted array with his style. I have this code so far and it is working good, but not in situations where there are media queries. What I would like to achieve is that I split selectors inside media query into single arrays but that each of them has his media query selector as well.
This is example of style in HTML
<style>
#abc{ background-color: gray; font-size: 10px;}
.abc { background-color: gray; font-size: 10px;}
#media only screen and (max-width:640px) {
#abc {
height: 200px !important;
}
}
#media only screen and (max-width:640px) {
#abcd {
height: 200px !important;
}
.abcd {
height: 200px !important;
}
}
</style>
This is code I have so far:
$dom = new DomDocument();
#$dom->loadHTML($html);
$para = $dom->getElementsByTagName('style'); #DOMNodeList
if ($para instanceof DOMNodeList) {
foreach ($para as $node) {
printf ($node->nodeValue);
}
}
$file = $node->nodeValue;
$arrs = explode('}', $file);
for ($i = 0; $i < count($arrs); $i++)
{
echo 'style ' . $i . ' - ' . $arrs[$i] . '<br />';
}
This is uotput I'm getting:
style 0 - #abc{ background-color: gray; font-size: 10px;
style 1 - .abc { background-color: gray; font-size: 10px;
style 2 - #media only screen and (max-width:640px) { #abc { height: 200px !important;
style 3 -
style 4 - #media only screen and (max-width:640px) { #abcd { height: 200px !important;
style 5 - .abcd { height: 200px !important;
Wanted output:
style 0 - #abc{ background-color: gray; font-size: 10px;
style 1 - .abc { background-color: gray; font-size: 10px;
style 2 - #media only screen and (max-width:640px) { #abc { height: 200px !important;
style 3 -
style 4 - #media only screen and (max-width:640px) { #abcd { height: 200px !important;
style 5 - #media only screen and (max-width:640px) { .abcd { height: 200px !important;
What would be proper way to get that?
You could try something like this, just keep in mind that this answer requires that you know or make sure that media queries are the last part of the stylesheet and that there are no other styles declared between one media and another, following the format of your example. Then you could do something like this:
...
$file = $node->nodeValue;
$parts = explode('#media', $file);
// The first part of the stylesheet, where there are no media queries
$styleCount = 0;
$arrs = explode('}', $parts[0]);
for ($i = 0; $i < count($arrs); $i++)
{
echo 'style ' . $i . ' - ' . $arrs[$i] . '<br />';
$styleCount++;
}
// The media queries, remember to validate that there exists at least one before
for ($i = 1; $i < count($parts); $i++){
$arrs = explode('{', $parts[$i], 2);
$title = "#media " . $arrs[0];
$arrIn = explode('}', $arrs[1]);
for($j = 0; $j < count($arrIn); $j++){
// Validate for an empty space or a new line, it could be just something like strlen($arrIn[$j]) > 3
if(strlen($arrIn[$j]) > 4){
echo 'style ' . $styleCount . ' - ' . $title . " { " . $arrIn[$j] . '</br>';
$styleCount++;
}
}
}
I need to customize codeigniter pagination. Currently pagination on my site is working like this. (I am using CI pagination library)
I want my pagination to look and work like this
What can I do with codeigniter's pagination library for this?
Is there already any customized library on internet? Or I have to create my own?
My $config array is
$config['first_link'] = false;
$config['last_link'] = false;
$config ['prev_link'] = '<i class="fa fa-caret-left"></i>';
$config ['next_link'] = '<i class="fa fa-caret-right"></i>';
$config ['num_links'] = 2;
$config ['base_url'] = 'My base url';
$config ['total_rows'] = 50;
$config ["per_page"] = 10;
$config ["uri_segment"] = 4;
$config ['use_page_numbers'] = TRUE;
Finally I came up with the solution by extending CI pagination library.
Created new class Mypagination and overrided the default create_links() method.
Here is the code
class Mypagination extends CI_Pagination {
function __construct()
{
parent::__construct();
}
public function create_links()
{
// If our item count or per-page total is zero there is no need to continue.
// Note: DO NOT change the operator to === here!
if ($this->total_rows == 0 OR $this->per_page == 0)
{
return '';
}
// Calculate the total number of pages
$num_pages = (int) ceil($this->total_rows / $this->per_page);
// Is there only one page? Hm... nothing more to do here then.
if ($num_pages === 1)
{
return '';
}
// Check the user defined number of links.
$this->num_links = (int) $this->num_links;
if ($this->num_links < 0)
{
show_error('Your number of links must be a non-negative number.');
}
// Keep any existing query string items.
// Note: Has nothing to do with any other query string option.
if ($this->reuse_query_string === TRUE)
{
$get = $this->CI->input->get();
// Unset the controll, method, old-school routing options
unset($get['c'], $get['m'], $get[$this->query_string_segment]);
}
else
{
$get = array();
}
// Put together our base and first URLs.
// Note: DO NOT append to the properties as that would break successive calls
$base_url = trim($this->base_url);
$first_url = $this->first_url;
$query_string = '';
$query_string_sep = (strpos($base_url, '?') === FALSE) ? '?' : '&';
// Are we using query strings?
if ($this->page_query_string === TRUE)
{
// If a custom first_url hasn't been specified, we'll create one from
// the base_url, but without the page item.
if ($first_url === '')
{
$first_url = $base_url;
// If we saved any GET items earlier, make sure they're appended.
if ( ! empty($get))
{
$first_url .= $query_string_sep.http_build_query($get);
}
}
// Add the page segment to the end of the query string, where the
// page number will be appended.
$base_url .= $query_string_sep.http_build_query(array_merge($get, array($this->query_string_segment => '')));
}
else
{
// Standard segment mode.
// Generate our saved query string to append later after the page number.
if ( ! empty($get))
{
$query_string = $query_string_sep.http_build_query($get);
$this->suffix .= $query_string;
}
// Does the base_url have the query string in it?
// If we're supposed to save it, remove it so we can append it later.
if ($this->reuse_query_string === TRUE && ($base_query_pos = strpos($base_url, '?')) !== FALSE)
{
$base_url = substr($base_url, 0, $base_query_pos);
}
if ($first_url === '')
{
$first_url = $base_url.$query_string;
}
$base_url = rtrim($base_url, '/').'/';
}
// Determine the current page number.
$base_page = ($this->use_page_numbers) ? 1 : 0;
// Are we using query strings?
if ($this->page_query_string === TRUE)
{
$this->cur_page = $this->CI->input->get($this->query_string_segment);
}
else
{
// Default to the last segment number if one hasn't been defined.
if ($this->uri_segment === 0)
{
$this->uri_segment = count($this->CI->uri->segment_array());
}
$this->cur_page = $this->CI->uri->segment($this->uri_segment);
// Remove any specified prefix/suffix from the segment.
if ($this->prefix !== '' OR $this->suffix !== '')
{
$this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page);
}
}
// If something isn't quite right, back to the default base page.
if ( ! ctype_digit($this->cur_page) OR ($this->use_page_numbers && (int) $this->cur_page === 0))
{
$this->cur_page = $base_page;
}
else
{
// Make sure we're using integers for comparisons later.
$this->cur_page = (int) $this->cur_page;
}
// Is the page number beyond the result range?
// If so, we show the last page.
if ($this->use_page_numbers)
{
if ($this->cur_page > $num_pages)
{
$this->cur_page = $num_pages;
}
}
elseif ($this->cur_page > $this->total_rows)
{
$this->cur_page = ($num_pages - 1) * $this->per_page;
}
$uri_page_number = $this->cur_page;
// If we're using offset instead of page numbers, convert it
// to a page number, so we can generate the surrounding number links.
if ( ! $this->use_page_numbers)
{
$this->cur_page = (int) floor(($this->cur_page/$this->per_page) + 1);
}
// Calculate the start and end numbers. These determine
// which number to start and end the digit links with.
$start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;
$end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;
// And here we go...
$output = '';
// Render the "Previous" link.
if ($this->prev_link !== FALSE && $this->cur_page !== 1)
{
$i = ($this->use_page_numbers) ? $uri_page_number - 1 : $uri_page_number - $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
if ($i === $base_page)
{
// First page
$output .= $this->prev_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('prev').'>'
.$this->prev_link.'</a>'.$this->prev_tag_close;
}
else
{
$append = $this->prefix.$i.$this->suffix;
$output .= $this->prev_tag_open.'<a href="'.$base_url.$append.'"'.$attributes.$this->_attr_rel('prev').'>'
.$this->prev_link.'</a>'.$this->prev_tag_close;
}
}
// Render the "First" link.
if ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1 + ! $this->num_links))
{
// Take the general parameters, and squeeze this pagination-page attr in for JS frameworks.
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, 1);
$output .= $this->first_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('start').'>'
.$this->first_link.'</a>'.$this->first_tag_close;
}
// Render the pages
if ($this->display_pages !== FALSE)
{
/*
* On page 4, show hidden page 2
*/
if($start == 4){
$start--;
}
/*
* On pages after 4, show dots before pages
*/
if(($start)>4){
$output .= '<div class="continues">. . .</div>';
}
/*
* On page 4th last, show hidden page 2nd last
*/
if($start == ($num_pages-3) && $start > 4){
$end++;
}
/*
* On last page, show hidden page 3rd last
*/
if($start == $num_pages && $start>3){
$start--;
}
/*
* On page 1, show hidden page 3
*/
if($start == 1 && $end < $num_pages-1){
$end++;
}
// Write the digit links
for ($loop = $start -1; $loop <= $end; $loop++)
{
$i = ($this->use_page_numbers) ? $loop : ($loop * $this->per_page) - $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
if ($i >= $base_page)
{
if ($this->cur_page === $loop)
{
// Current page
$output .= $this->cur_tag_open.$loop.$this->cur_tag_close;
}
elseif ($i === $base_page)
{
// First page
$output .= $this->num_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('start').'>'
.$loop.'</a>'.$this->num_tag_close;
}
else
{
$append = $this->prefix.$i.$this->suffix;
$output .= $this->num_tag_open.'<a href="'.$base_url.$append.'"'.$attributes.$this->_attr_rel('start').'>'
.$loop.'</a>'.$this->num_tag_close;
}
}
}
/*
* On pages before last, show dots
*/
if($end < ($num_pages-1)){
$output .= '<div class="continues">. . .</div>';
}
}
// Render the "Last" link
if ($this->last_link !== FALSE && ($this->cur_page + $this->num_links + ! $this->num_links) < $num_pages)
{
$i = ($this->use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
$output .= $this->last_tag_open.'<a href="'.$base_url.$this->prefix.$i.$this->suffix.'"'.$attributes.'>'
.$this->last_link.'</a>'.$this->last_tag_close;
}
// Render the "next" link
if ($this->next_link !== FALSE && $this->cur_page < $num_pages)
{
$i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
$output .= $this->next_tag_open.'<a href="'.$base_url.$this->prefix.$i.$this->suffix.'"'.$attributes
.$this->_attr_rel('next').'>'.$this->next_link.'</a>'.$this->next_tag_close;
}
// Kill double slashes. Note: Sometimes we can end up with a double slash
// in the penultimate link so we'll kill all double slashes.
$output = preg_replace('#([^:])//+#', '\\1/', $output);
// Add the wrapper HTML if exists
return $this->full_tag_open.$output.$this->full_tag_close;
}
}
I have added
/*
* my comments here
*/
styled comments before code where I made changes.
Use
$config['num_links'] = 4;
in your $config array.
Try CSS here is an example - once used this and it worked
.dataTables_wrapper .dataTables_info.dataTables_paginate .pagination,
.dataTables_wrapper .dataTables_paginate.dataTables_paginate .pagination {
margin: 0;
}
.pagination {
display: inline-block;
padding-left: 0;
margin: 17px 0;
border-radius: 3px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
line-height: 1.42857143;
text-decoration: none;
color: #373e4a;
background-color: #fff;
border: 1px solid #ddd;
margin-left: -1px;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
z-index: 2;
color: #818da2;
background-color: #eeeeee;
border-color: #ddd;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 3;
color: #fff;
background-color: #373e4a;
border-color: #949494;
cursor: default;
}
.pagination > .disabled > span,
.pagination > .disabled > span:hover,
.pagination > .disabled > span:focus,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #999999;
background-color: #fff;
border-color: #ddd;
cursor: not-allowed;
}
.pagination-lg > li > a,
.pagination-lg > li > span {
padding: 10px 16px;
font-size: 15px;
line-height: 1.3333333;
}
.pagination-lg > li:first-child > a,
.pagination-lg > li:first-child > span {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.pagination-lg > li:last-child > a,
.pagination-lg > li:last-child > span {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.pagination-sm > li > a,
.pagination-sm > li > span {
padding: 5px 10px;
font-size: 11px;
line-height: 1.5;
}
.pagination-sm > li:first-child > a,
.pagination-sm > li:first-child > span {
border-bottom-left-radius: 2px;
border-top-left-radius: 2px;
}
.pagination-sm > li:last-child > a,
.pagination-sm > li:last-child > span {
border-bottom-right-radius: 2px;
border-top-right-radius: 2px;
}
.pager {
padding-left: 0;
margin: 17px 0;
list-style: none;
text-align: center;
}
.pager li {
display: inline;
}
.pager li > a,
.pager li > span {
display: inline-block;
padding: 5px 14px;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 3px;
}
.pager li > a:hover,
.pager li > a:focus {
text-decoration: none;
background-color: #eeeeee;
}
.pager .next > a,
.pager .next > span {
float: right;
}
.pager .previous > a,
.pager .previous > span {
float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
color: #999999;
background-color: #fff;
cursor: not-allowed;
}
Is there a simple way to modify this php:
function cycleCols() {
$p = "transparent;";
$s = "#efefef;";
static $lastColour;
$lastColour = ($lastColour == $p) ? $s : $p;
return $lastColour;
}
To get it to cycle like this:
transparent;
transparent;
#efefef;
#efefef;
transparent;
transparent;
#efefef;
#efefef;
Etc, instead of how it does now..
transparent;
#efefef;
transparent;
#efefef;
Etc... or does something else entirely need to be built to do this?
function cycleCols() {
static $colors = ['transparent;', '#efefef;'], $i = 0;
$selectColor = ($i++/2 % 2 == 0) ? 0 : 1;
return $colors[$selectColor];
}
Increment a counter ($i), divide it by 2, then check if it's even/odd.
In the comment leaving system on part of my website there is a weird blank entry that always remains above the latest real entry. I've looked in the database directly and there isn't a blank entry. Yet, on the top of all my comments, there is always an empty box that is formatted the same way as the rest of the comments. Where is this coming from and how do I get rid of it? Here is the php:
$query = "SELECT * FROM catharsis";
$result = mysql_query($query);
$num = mysql_numrows($result);
mysql_close();
echo "<h4><center>Let it out.</center></h4>";
echo '<ul class="comments">';
for ($i = 0; $i < $num; $i++) {
$name = mysql_result($result,$num - $i,"message");
echo "<li>$name</li>";
echo '<br>';
}
echo '</ul>';
relevant css:
ul.comments {
list-style-type: none;
position: relative;
right: 2.5em;
}
ul.comments li {
list-style-type: none;
background-color: c0dbff;
border-style: solid;
border-width: 1px;
border-color: black;
padding: .4em;
}
$query = 'SELECT message FROM catharsis ORDER BY id DESC';
$result = mysql_query($query);
mysql_close();
echo '<h4><center>Let it out.</center></h4>';
echo '<ul class="comments">';
while($t = mysql_fetch_array($result)){
echo '<li>'.$t[0].'</li><br>';
}
echo '</ul>';
I believe it comes from the first time this line is executed:
$name = mysql_result($result,$num - $i,"message");
Since your results are indexed from 0 to $num-1 you won't have an entry with the index $num-0.
Change that line to read
$name = mysql_result($result,$num - $i -1,"message");
or start $i at 1 and let it run up to <= $num
Can you confirm that if you echo $num it is zero?
You don't want to be printing a ul when you don't have any li entries anyway so you'd want something like this:
if ($num > 0)
{
echo '<ul class="comments">';
for ($i = 0; $i < $num; $i++) {
$name = mysql_result($result,$num - $i,"message");
echo "<li>$name</li>";
echo '<br>';
}
echo '</ul>';
}