Search code examples
phparrayscolumnsorting

Sorting understanding issue in a Multidimenssional Array in PHP


I am trying to sort a multidimensional array. The array contains City & Population. These are displayed in a table.I want to sort the Population column in a ascending order. I do understand, that the procedure is sort($array_variable), but i don't know how to print them after sorting. Please help me educating in this matter. The program is as follows

<html>
<head>
    <style>
        table, tr, td, th {
            border:1px solid blue;
            border-collapse: collapse;
        }
    </style>
</head>
<body>
    <?php
    $data=array (
        array('New York','Washington',8008278),
        array('Los Angeles','California',3694820),
        array('Chicago','Illinois',2896016),
        array('Houston','Texas',1953631),
        array('Philadelphia','Philadelphia',1517550),
        array('Pheonix','Arizona',1321045),
        array('San Diego','California',1223400),
        array('Dallas','Texas',188580),
        array('San Antonio','Texas',144646),
        array('Detroit','Michigan',951270),                        
    );
    print '<table>';

    print '<th>'; print "City"; print '</th>';
    print '<th>'; print "State"; print '</th>';
    print '<th>'; print "Population"; print '</th>';

    print '<tr>';
    print '<td>'; print $data[0][0]; print '</td>';
    print '<td>'; print $data[0][1]; print '</td>';
    print '<td>'; print $data[0][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[1][0]; print '</td>';
    print '<td>'; print $data[1][1]; print '</td>';
    print '<td>'; print $data[1][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[2][0]; print '</td>';
    print '<td>'; print $data[2][1]; print '</td>';
    print '<td>'; print $data[2][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[3][0]; print '</td>';
    print '<td>'; print $data[3][1]; print '</td>';
    print '<td>'; print $data[3][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[4][0]; print '</td>';
    print '<td>'; print $data[4][1]; print '</td>';
    print '<td>'; print $data[4][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[5][0]; print '</td>';
    print '<td>'; print $data[5][1]; print '</td>';
    print '<td>'; print $data[5][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[6][0]; print '</td>';
    print '<td>'; print $data[6][1]; print '</td>';
    print '<td>'; print $data[6][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[7][0]; print '</td>';
    print '<td>'; print $data[7][1]; print '</td>';
    print '<td>'; print $data[7][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[8][0]; print '</td>';
    print '<td>'; print $data[8][1]; print '</td>';
    print '<td>'; print $data[8][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print $data[9][0]; print '</td>';
    print '<td>'; print $data[9][1]; print '</td>';
    print '<td>'; print $data[9][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td colspan=2>'; print "Total Population is:";  
    print '</td>';
    print '<td>'; print $data[0][2]+$data[1][2]+$data[2][2]+$data[3][2]+$data[4][2]+$data[5][2]+$data[6][2]+$data[7][2]+$data[8][2]+$data[9][2]; print '</td>';
    print '</tr>';

    print '<tr>';
    print '<td>'; print sort($data); print '</td>';
    print '</tr>';        
    print '</table>';
    ?>
</body>

Sorry for the long program, a noob here. As you see. I have given a sort() function, but it doesn't giving the desired output. Thank you.

enter image description here


Solution

  • Just use a loop to print out the data. Also I'd create a class City and use usort to compare based on the population property. Something like this:

    <?php
    
    class City{
        public $population;
        public $name;
        public $state;
    
        public function __construct($name,$state,$population) {
        $this->name = $name;
        $this->state = $state;
        $this->population = $population;
        }
    
    }
    $data=array (          
            new City('New York','Washington',8008278),
            new City('Los Angeles','California',3694820),
            new City('Chicago','Illinois',2896016),
            new City('Houston','Texas',1953631),
            new City('Philadelphia','Philadelphia',1517550),
            new City('Pheonix','Arizona',1321045),
            new City('San Diego','California',1223400),
            new City('Dallas','Texas',188580),
            new City('San Antonio','Texas',144646),
            new City('Detroit','Michigan',951270)              
        );
    
    
    usort($data, function($a, $b)
    {
        return $a->population < $b->population;
    });
    
    print '<table>';
        print '<tr>';
        print '<th>'; print "City"; print '</th>';
        print '<th>'; print "State"; print '</th>';
        print '<th>'; print "Population"; print '</th>';
        print '</tr>';
    
    
    foreach($data as $currCity){    
        print '<tr>';
        print '<td>'; print $currCity->name; print '</td>';
        print '<td>'; print $currCity->state; print '</td>';
        print '<td>'; print $currCity->population; print '</td>';
        print '</tr>';
    
    }