My foreach with if statement works weird

#1

Hello,

I have a list of values (ascending order. I got in a query .

I want to count how many are negative. As I kept on getting o negative values I extended the IF statement to try to understand what is going on

Here is the code

$items = get_all_profits();
print_r($items);

echo '<br><br>';

	//	   Create a variable to count how many negative profits    ////////
	$count_neg = 0;
	//////   Count how many negative profits are in $items	  /////////
 
   foreach($items as $profit)
	  {  
		 if($profit < 0){
		    echo 'hello'.'<br>';
		 }else
		 if($profit > 0){
			 $count_neg++;
			 echo $count_neg.' goody '.'<br>';
		 }else
		 if($profit = 0){
			 echo 'dodod'.'<br>';
		 }				
	  }//  End foreach loop

Here is a screen shot with the array and the output of the IF statement:

What do I miss Here? All values are considered positive while the first 87 are all negative

#2

This is rather simple.

<?php declare(strict_types=1);

$profit = [5,-20,10,15,-50];
$count = 0;
foreach($profit as $value){
    if($value < 0){
        $count++;
    }
}

echo "There are $count negative values";
#3

You need to read up on the difference between assignment and comparison operators, too.

if($profit = 0){

That output doesn’t come from the code you posted, does it? None of them display hello, goody or dodod.

As your print_r shows, though, you have an array of arrays here. So wouldn’t you need to look at $profit['profit'] to check the values? You could check by displaying the value of $profit as part of your debugging routine.

#4

At the very least, this allows you to short-circuit your search. As soon as you see a non-negative, abort the loop.

Alternatively:

$count = count(array_filter($items,function($a) { return $a < 0; }));
#5

Or for that matter, refine your query to only select the negative values in the first place, if thats all you’re concerned with.

3 Likes
#6

Wouldn’t it need to be

$count = count(array_filter($items,function($a) { return $a['profit'] < 0; }));
#7

squints at the op Yes, it would, but… the original post’s code was treating it as an array of integers. Which it isnt. So there’s the original confusion.

#8

Try this which will add linefeeds to every array item:

echo '<pre>';
print_r( $items );
echo '</pre>';

// also try 
var_dump( $items );

// and not forgetting to pause script
die( 'optional message to display after stopping program execution' );
// above is good for loops
closed #9

This topic was automatically closed 91 days after the last reply. New replies are no longer allowed.