Adding Ordinal Contractions to $i [duplicate] - php
This question already has answers here:
Closed 12 years ago.
Possible Duplicate:
php display number with ordinal suffix
I'm attempting to add ordinal contractions i.e.(st/nd/rd/th) to an increment.
Somehow I need to get the last digit of $i to test it against my if statements...
Here is my code so far:
$i = 1;
while($i < 101 ){
if($i == 1){$o_c = "st";}else{$o_c = "th";}
if($i == 2){$o_c = "nd";}
if($i == 3){$o_c = "rd";}
echo $i.$o_c."<br/>";
$i++;
}
You can use the modulus (%) operator to get the remainder when dividing by 10.
$i = 1;
while($i < 101 ){
$remainder = $i % 10;
if($remainder == 1){$o_c = "st";}else{$o_c = "th";}
if($remainder == 2){$o_c = "nd";}
if($remainder == 3){$o_c = "rd";}
echo $i.$o_c."<br/>";
$i++;
}
What about using the modulus operator: $i % 10?
Display numbers with ordinal suffix in PHP
(that thread has other solutions. I liked that one)
Related
For loop with date('d') or date('j') in php totally bug my navigator [duplicate]
This question already has answers here: The 3 different equals (5 answers) Closed 5 years ago. I have a strange issue in my site conception... I try to create a select with 3 input, one for day, one for month and one for year. The year input work clean, but, if I try that for day: for($i = 1; $i <= date('t'); $i++) { if ($i < 10) { $i = '0'. $i; } if ($i = date('d')) { echo '<option selected>'. $i .'</option>'; } else { echo '<option>'. $i .'</option>'; } } This bug totally my navigator (Firefox up to date version) and I don't understand why...
Change:- if ($i = date('d')) {//it's assignment not comparison To:- if ($i == date('d')) { //or if ($i === date('d')) { now it's comparison Output:-https://eval.in/860475 OR https://eval.in/860476 Reference:- The three different equals
A quick way to set Excel column headers to an array in PHP [duplicate]
This question already has answers here: Algorithm to get the excel-like column name of a number (11 answers) Closed 5 years ago. I am using an array for selecting the column in Excel. Right now I need A through CZ, but it might need to expand to a larger set in the future. I'm hoping that someone has a faster or better way than what I'm currently doing this. Here is what I'm doing now: $ColumnArray2 = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); $ColumnArray = array(); for($x = 0 ; $x <= 25 ; $x++) { $ColumnArray[] = $ColumnArray2[$x]; } for($x = 0 ; $x <= 4 ; $x++) { for($y = 0 ; $y <= 25 ; $y++) { $ColumnArray[] = $ColumnArray2[$x].$ColumnArray2[$y]; } } This gives me an array with 155 values going from A to EZ. Is there a better way to accomplish this?
You do realise that PHP supports perl-style incrementing of characters, which means that you can do: $startColumn = 'A'; $endColumn = 'CZ'; ++$endColumn; $ColumnArray = []; for($column = $startColumn; $column != $endColumn; ++$column) { $ColumnArray[] = $column; } The only thing to watch out for is the end condition cannot use < or >, so we increment the actual end, and use !=
One of solutions: $ColumnArray2 = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); $ColumnArray = array(); for($x = 0 ; $x <= 5 ; $x++) { foreach ($ColumnArray2 as $v) { $ColumnArray[] = $x == 0? $v : $ColumnArray[$x-1] . $v; } }
php 5, for loop not displaying correctly series of numbers that starts with 0 [duplicate]
This question already has answers here: Formatting a number with leading zeros in PHP [duplicate] (11 answers) Closed 8 years ago. I'm trying to get the results of the for loop like: 00001, 00002, 00003, etc. but the result is not displaying 0's: instead I get: 1, 2, 3, etc. This is the code: $min = 00001; $max = 00005; for ($x = $min; $x <= $max; $x++) { echo "$x "; }
Just change your echo statement to this: echo sprintf('%05d', $x); Also i would recommend you to change your $min and $max variables to this: $min = 1; $max = 5; Because if you have leading zeros then number gets interpreted as an octal number! So 00012 would not be 12 it would be 10.
<?php $min = 00001; $max = 00005; for ($x = $min; $x <= $max; $x++) { printf("%5d",$x); } ?> this is new code <?php $min = 00001; $max = 00005; for ($x = $min; $x <= $max; $x++) { printf("%05d",$x); echo '<br>'; } ?>
Thanks a lot for the help. Doing the trick via MySQL got everything done. Just had to change the value to decimal and assign the field size (7) with the corresponding zerofill attribute. Now i can insert the count of the for loop without zeros but the db inserts them for me. Thanks
PHP Loop do action for each 10, 20, 30 etc [duplicate]
This question already has answers here: PHP: How do you determine every Nth iteration of a loop? (8 answers) Closed 3 years ago. In php i have loop e.g. for ($i = 0; $i <= 1000; $i++) { if ($i = 10 || $i == 20 || $i == 30 || $i == 40 || $i == 50 || $i == 60) { echo $i; } } imagine i need to echo $i every 10,20,30,40,50,60,..970,980,990 there should be way to not write 100 conditions in if statement. Is there some logical way to see if $i increased by 10 then do something like: if ($i == $i+10) { ... } P.S. if possible i dont want to introduce another variable to count i need to find solution with using only $i
Try: if ($i % 10 == 0) That will trigger whenever your index is exactly divisible by 10.
rewrite your for loop to: for ($i = 0; $i <= 1000; $i+=10) { And I don't know whether it worked for you with commas like this (as in your initial post): for ($i = 0, $i <= 1000, $i++) {
Skip extra looping: for ($i = 10; $i <= 1000; $i=$i+10) { echo $i; } Or if you still want to loop every single digit between: for ($i = 0; $i <= 1000; $i++) { if( $i % 10 === 0 ) { echo $i; } } Test Here
Put this inside your main loop. '%', or 'mod', gives you the remainder of $i / 10. If the remainder is '0', then you want to print. if(0 === ($i % 10)) { echo $i; }
how to find the sum of all the multiples of 3 or 5 below 1000 in php, issue?
i have an small issue with the way this problem is resolved. some would say: println((0 /: ((0 until 1000).filter(x => x % 3 == 0 || x % 5 == 0))) (_+_)) is the solution witch adds to 233168 my way was to do: $maxnumber = 1000; for ($i = 3; $i < $maxnumber; $i += 3) { $t += $i; echo $i.','; } echo '<br>'; for ($j = 5; $j < $maxnumber; $j += 5) { $d += $j; echo $j.','; } echo '<br>'; echo $t; echo '<br>'; echo $d; echo '<br>'; echo $t+$d; this will give me : 3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396,399,402,405,408,411,414,417,420,423,426,429,432,435,438,441,444,447,450,453,456,459,462,465,468,471,474,477,480,483,486,489,492,495,498,501,504,507,510,513,516,519,522,525,528,531,534,537,540,543,546,549,552,555,558,561,564,567,570,573,576,579,582,585,588,591,594,597,600,603,606,609,612,615,618,621,624,627,630,633,636,639,642,645,648,651,654,657,660,663,666,669,672,675,678,681,684,687,690,693,696,699,702,705,708,711,714,717,720,723,726,729,732,735,738,741,744,747,750,753,756,759,762,765,768,771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831,834,837,840,843,846,849,852,855,858,861,864,867,870,873,876,879,882,885,888,891,894,897,900,903,906,909,912,915,918,921,924,927,930,933,936,939,942,945,948,951,954,957,960,963,966,969,972,975,978,981,984,987,990,993,996,999 5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505,510,515,520,525,530,535,540,545,550,555,560,565,570,575,580,585,590,595,600,605,610,615,620,625,630,635,640,645,650,655,660,665,670,675,680,685,690,695,700,705,710,715,720,725,730,735,740,745,750,755,760,765,770,775,780,785,790,795,800,805,810,815,820,825,830,835,840,845,850,855,860,865,870,875,880,885,890,895,900,905,910,915,920,925,930,935,940,945,950,955,960,965,970,975,980,985,990,995 $t - 166833 $d - 99500 and total: 266333 why am i wrong?
Some numbers are multiples of both 3 and 5. (Your algorithm adds these numbers to the total twice.)
Because 6 * 5 == 30 and 10 * 3 == 30, you're adding the some numbers up twice. $sum = 0; $i = 0; foreach(range(0, 999) as $i) { if($i % 3 == 0 || $i % 5 == 0) $sum += $i; }
Because you double-count numbers that are multiple of both 3 and 5, i.e. multiples of 15. You can account for this naively by subtracting all multiples of 15. for ($j = 15; $j < $maxnumber; $j += 15) { $e += $j; echo $j.','; } $total = $total - $d;
In your case, if it is 15, you will add the number twice. Try this: $t = 0; $d = 0; for ($i = 0; $i <= $maxnumber; $i++){ if ($i % 3 == 0) $t+= $i; else if ($i % 5 == 0) $d += $i; } echo $t.'<br>'.$d;
I think that in your code, if a number is a multiple of 3 and 5, it is added twice. Take 15 for example. It's in your list of multiples of 3 and in the list of multiples of 5. Is this the behaviour you want?
One of the best approach to this solution (to achieve optimum time complexity), run an Arithmetic Progression series and find the number of terms in all series by using AP formula: T=a+(n-1)d, then find sum by : S=n/2[2*a+(n-1)d] where : a=first term ,n=no. of term , d=common deference, T=nth term The code solution below has been implemented to suit the question above - so the values 3 and 5 are hard-coded. However, the function can modified such that values are passed in as variable parameters. function solution($number){ $val1 = 3; $val2 = 5; $common_term = $val1 * $val2; $sum_of_terms1 = calculateSumofMulitples($val1,$number); $sum_of_terms2 = calculateSumofMulitples($val2,$number); $sum_of_cterms = calculateSumofMulitples($common_term,$number); $final_result = $sum_of_terms1 + $sum_of_terms2 - $sum_of_cterms; return $final_result; } function calculateSumofMulitples($val, $number) { //first, we begin by running an aithmetic prograssion for $val up to $number say N to get the no of terms [using T=a +(n-1)d] $no_of_terms = (int) ($number / $val); if($number % $val == 0) $no_of_terms = (int) ( ($number-1)/$val ); //since we are computing for a no of terms below N and not up to/exactly/up to N. if N divides val with no remainder, use no of terms = (N-1)/val //second, we compute the sum of terms [using Sn = n/2[2a + (n-1)d] $sum_of_terms = ($no_of_terms * 0.5) * ( (2*$val) + ($no_of_terms - 1) * $val ); // sum of multiples return $sum_of_terms; }
You can run a single loop checking whether the number is multiple of 3 OR 5: for ($i = 0; $i < $maxnumber; $i++) { if($i%3 || $i%5){ $t += $i; echo $i.',';} }
I think the original code is not including numbers which are multiples of both 3 and 5 in the total: if the test for multiple of 3 matches, it takes that and goes on. If you total the multiples of 15 up to 1000, you get 33165, which is exactly the difference between your total, 266333, and the original total, 233168.
Here's my solution to the question: <?php $sum = 0; $arr = []; for($i = 1; $i < 1000; $i++){ if((int)$i % 3 === 0 || (int)$i % 5 === 0) { $sum += $i; array_push($arr,$i); } } echo $sum; echo '<br>'; print_r($arr);//Displays the values meeting the criteria as an array of values