2

I'm using the following piece of code to count the number of locations from a table:

$result = mysqli_query($conn,"SELECT location FROM table ORDER BY location");

$aloc_list = array();
while ($row = mysqli_fetch_array($result))
        {$aloc_list[] = $row['location'];
        }

print_r(array_count_values($aloc_list));

Which gives me the following array:

Array
(
    [CANADA] => 106
    [USA] => 547
    [MEXICO] => 93
    [GREAT_BRITAIN] => 111
    [EASTERN_EUROPE] => 227
    [RUSSIA] => 405
    [CHINA] => 341
    [INDIA] => 253
)

I have tried to 'extract' the array values and put them in a variable but nothing seems to work:

$canada = $aloc_list[0];
$canada = $aloc_list['CANADA'];
$canada = $aloc_list[0]['CANADA'];
$canada = $aloc_list[0];

I want to end up with a variable called $canada equal to 106, a variable called $usa equal to 547, etc.

How do I accomplish this?

Mr_Thomas
  • 857
  • 3
  • 19
  • 39

5 Answers5

5

If you don't want to change your query, you can store the result of array_count_values($aloc_list) and use it to extract the datas. You can use variables variables to generate dynamically variables, but I don't recommend this. You might want to check if variable exists before using it. (isset())

$aloc_list_count = array_count_values($aloc_list);
var_dump($aloc_list_count);
/*
Outputs
array (size=8)
    'CANADA' => int 106
    'USA' => int 547
    'MEXICO' => int 93
    'GREAT_BRITAIN' => int 111
    'EASTERN_EUROPE' => int 227
    'RUSSIA' => int 405
    'CHINA' => int 341
    'INDIA' => int 253
*/
foreach ($aloc_list_count AS $key => $value)
    ${strtolower($key)} = $value;
echo $canada; //106
echo $usa;    //547
echo $france; //Notice: Undefined variable: france in...

Or you can use extract function to achieve that

extract($aloc_list_count);
Cid
  • 14,968
  • 4
  • 30
  • 45
  • 2
    Good idea with the variable variable, but you should apply `strtolower()` to it, OP said they want the variables to be lowercase. – GrumpyCrouton Sep 25 '18 at 13:48
3

You are trying to select the mentioned values from the original $aloc_list array - but they don't directly exist in there. They're the result of the call to array_count_values($aloc_list) - this produces a new array, and you need to read from that instead.

For example:

$counts = array_count_values($aloc_list);
$canada = $counts['CANADA'];
echo $canada; 
ADyson
  • 57,178
  • 14
  • 51
  • 63
  • 1
    @MadhurBhaiya No it isn't, this answer is better because it _explains what's happening_, and what is needing to happen. – GrumpyCrouton Sep 25 '18 at 13:51
3

Try the following instead:

$sql = "SELECT location, COUNT(*) as count_per_location 
        FROM table 
        GROUP BY location 
        ORDER BY location"

$result = mysqli_query($conn, $sql);

$aloc_list = array();
while ($row = mysqli_fetch_assoc($result))
{ 
    ${strtolower($row['location']} = $row['count_per_location'];
}
Cid
  • 14,968
  • 4
  • 30
  • 45
Madhur Bhaiya
  • 28,155
  • 10
  • 49
  • 57
  • 1
    This is certainly the best answer if he doesn't need the query to do something else than counting elements – Cid Sep 25 '18 at 14:11
1

you are returning the array from array_count_values into the print_r function. try this

 $test = array_count_values($aloc_list);
 echo $test['CANADA']; 
1

on the line with:

print_r(array_count_values($aloc_list));

Try this instead:

$mergeLocations = array_count_values($aloc_list);
var_dump($mergeLocations['CANADA']);
var_dump($mergeLocations['USA'])

By the way, would be smarter to use mysql GROUP BY function for counting locations:

SELECT location, count(*) as total FROM table GROUP BY location ORDER BY total DESC
zebnat
  • 521
  • 3
  • 13