как я могу разобрать php-массив следующим образом:
$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")));
для вставки в таблицу MySQL следующим образом:
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 ;
Когда я использую foreach
и как $cars["Hummer"]["H2"]["length"];
Я каким-то образом не могу получить еще одно измерение массива и одновременно кэшировать фактический бренд / модель … Tho, мой фактический массив составляет около 3000 элементов в первом измерении (бренды).
Вам нужны две петли, одна для брендов и одна для их моделей:
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']});"; } }
foreach ( $cars as $brandname => $carinfo ) { foreach ( $carinfo as $modelname => $car ) { // brand = $brandname // model = $modelname // length = $car['length'] // do insert query here } }
$rows = ''; foreach($cars AS $brand) { foreach($brand AS $model) { if(!empty($rows)) $rows .= ', '; $rows = "({$car['width']},...)"; } } $sql = "INSERT INTO cars_dimensions (width,...) VALUES $rows";
Полный исполняемый код и TESTED . Это более эффективный и быстрый способ сделать это. Используя этот способ, вы можете вставить несколько строк, используя один запрос на вставку.
<?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(); } ?>
Надеюсь, это вам поможет. Спасибо.