2

how can I parse php array like this:

$cars= array(
    "Ford"=>array("C-Max"=>array("length"=>"4333","width"=>"1825","height"=>"1560"),"Escape"=>array("length"=>"4480","width"=>"1845","height"=>"1730")
    ,"Explorer"=>array("length"=>"4912","width"=>"1872","height"=>"1849"),"Fiesta"=>array("length"=>"3950","width"=>"1973","height"=>"1433")
    ,"Focus"=>array("length"=>"4488","width"=>"1840","height"=>"1497"),"Fusion"=>array("length"=>"4013","width"=>"1724","height"=>"1543")
    ,"Galaxy"=>array("length"=>"4820","width"=>"1854","height"=>"1723"),"Kuga"=>array("length"=>"4443","width"=>"1842","height"=>"1677")
    ,"Mondeo"=>array("length"=>"4844","width"=>"1886","height"=>"1500"),"Ranger"=>array("length"=>"5075","width"=>"1805","height"=>"1745")
    ,"S-Max"=>array("length"=>"4768","width"=>"1854","height"=>"1658"),
    "Hummer"=>array("H2"=>array("length"=>"5170","width"=>"2063","height"=>"2012"),"H3"=>array("length"=>"4782","width"=>"1989","height"=>"1872")));

to insert into MySQL table like this:

CREATE TABLE IF NOT EXISTS `cars_dimensions` (
  `id` int(10) NOT NULL auto_increment,
  `brand` varchar(120) character set utf8 NOT NULL,
  `model` varchar(120) character set utf8 NOT NULL,
  `length` varchar(5) character set utf8 NOT NULL,
  `width` varchar(5) character set utf8 NOT NULL,
  `height` varchar(5) character set utf8 NOT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

When I use foreach and like $cars["Hummer"]["H2"]["length"]; I somehow can't get another array dimension and cache the actual brand/model at the same time... Tho, my actual array is about 3000 items in the first dimension (brands).

2
  • Every answer so far assumes that Hummer is on the same level as Ford, but in your example it isn't, perhaps that's just a typo though. If it is their code will work, if it isn't none of the 3 answers so far are appropriate. Commented Jul 29, 2010 at 11:59
  • Yes, sorry I just copy-pasted the code in a wrong way :) Commented Jul 29, 2010 at 12:13

4 Answers 4

4

You need two loops, one for the brands and one for their models:

foreach ($cars as $brand => $models) {
    foreach ($models as $model => $specs) {
        $query = "INSERT INTO cars_demensions (brand, model, length, weight, height)
                  VALUES ('$brand', '$model', {$specs['length']}, {$specs['width']}, {$specs['height']});";
    }
}
Sign up to request clarification or add additional context in comments.

Comments

1
foreach ( $cars as $brandname => $carinfo  )
{
foreach ( $carinfo  as $modelname => $car )
{
// brand = $brandname
// model = $modelname
// length = $car['length']
// do insert query here
}
}

Comments

1

$rows = '';
foreach($cars AS $brand) {
  foreach($brand AS $model) {
    if(!empty($rows)) $rows .= ', ';
    $rows = "({$car['width']},...)";
  }
}

$sql = "INSERT INTO cars_dimensions (width,...) VALUES $rows";

Comments

0

Full executable code and TESTED. This is more efficient and faster way to do this. Using this way you can insert multiple row using a single insert query.

<?php 
$col = [];
foreach ($cars as $brand => $models) {
    foreach ($models as $model => $specs) {
        if (isset($specs['length']) || isset($specs['width']) || isset($specs['height'])) {
            $length = $specs['length'];
            $width = $specs['width'];
            $height = $specs['height'];
        } else {
            foreach ($specs as $k => $v) {
                $length = $v['length'];
                $width = $v['width'];
                $height = $v['height'];
            }
        }
        $col[] = "('" . $brand . "', '" . $model . "', '" . $length . "', '" . $width . "', '" . $height . "')";
    }
}
$query = "INSERT INTO `cars_dimensions`(`brand`, `model`, `length`, `width`, `height`) VALUES" . implode(',', $col) . ";";

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->exec($query);
} catch (PDOException $e) {
    echo $e->getMessage();
}
?>

Hopefully it should help you. Thank you.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.