Help With Minimising Rating Script

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
User avatar
chris98
Forum Contributor
Posts: 103
Joined: Tue Jun 11, 2013 10:47 am
Location: England, United Kingdom

Help With Minimising Rating Script

Post by chris98 »

I'm creating a rating script and at the end of the page, I'm showing the current rating so far. But the issue is it's quite lengthy and I'm about 90% sure that I could go around this another way. Here is the code for displaying the current rating, I'm convinced I could get a while loop in there but I can't for the life of me think how. Has anyone got any ideas?

(And yes, those are <inputs>. My CSS turns them into stars. Without the inputs, the star won't work.)

Code: Select all

if ($actual_rating == '1')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '2')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '3')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '4')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
elseif ($actual_rating == '5')
{
	$stars = '<div class="rating">
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
	<div>
		<div class="star">
			<input type="image" id="star" />
		</div>
	</div>
</div>';
}
else
{
	$stars = '<div class="rating">
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
	<div>
		<div class="nostar">
			<input type="image" id="nostar" />
		</div>
	</div>
</div>';
}
User avatar
requinix
Spammer :|
Posts: 6617
Joined: Wed Oct 15, 2008 2:35 am
Location: WA, USA

Re: Help With Minimising Rating Script

Post by requinix »

All of those blocks are exactly the same except for "star" vs "nostar". So why rewrite the entire block each time when you could just rewrite the "star"? And why count out the five of them separately when you could actually count out the five of them?

Code: Select all

$stars = '<div class="rating">';
for ($i = 1; $i <= 5; $i++) {
    if ($i <= $actual_rating) {
        $star = 'star';
    } else {
        $star = 'nostar';
    }

    $stars .= '
    <div>
        <div class="' . $star . '">
            <input type="image" />
        </div>
    </div>';
}
$stars .= '</div>';
Note the different markup too. You must not reuse IDs on elements. It is invalid HTML. Use classes instead...

...but you already have classes on the parent DIVs, so you can just use that.

Code: Select all

/* old */
div.star input#star { ... }
div.nostar input#nostar { ... }

/* new */
div.star input { ... }
div.nostar input { ... }
User avatar
chris98
Forum Contributor
Posts: 103
Joined: Tue Jun 11, 2013 10:47 am
Location: England, United Kingdom

Re: Help With Minimising Rating Script

Post by chris98 »

Perfect - I knew there would be a simple solution thanks. :)
Post Reply