Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态合并数组的算法_Php_Arrays_Algorithm_Logic - Fatal编程技术网

Php 动态合并数组的算法

Php 动态合并数组的算法,php,arrays,algorithm,logic,Php,Arrays,Algorithm,Logic,我正在尝试为PHPExcel对象中的每一行创建一个INSERT语句。当我努力遍历该列时(即转到B1 C1 D1,获取值并将其放入数组),我选择获取每列的所有值并将其放入一个多维数组,如下所示: Array ( [foo] => Array ( [0] => 250 [1] => 247 [2] => 279 [3] => 249 )

我正在尝试为PHPExcel对象中的每一行创建一个INSERT语句。当我努力遍历该列时(即转到B1 C1 D1,获取值并将其放入数组),我选择获取每列的所有值并将其放入一个多维数组,如下所示:

Array
(
    [foo] => Array
        (
            [0] => 250
            [1] => 247
            [2] => 279
            [3] => 249
        )

    [bar] => Array
        (
            [0] => AM PROV
            [1] => AM PROV
            [2] => AM PENS
            [3] => AM PROV
        )

    [schoo] => Array
        (
            [0] => xxxx
            [1] => yyy
            [2] => zzz
            [3] => aaa
        )
)
我想合并每个数组,以便索引0处的所有数据都在一个数组中,等等。我构建了一个通用工具,允许您从上传的电子表格中选择所需的列。它需要首先将列数据合并到单个数组中,然后为每个数组生成INSERT语句。因此,最终可交付成果如下:

插入(foo,bar,schoo)值(250,“AM PROV”,“xxxx”)

谢谢你的帮助


更新:大家好,非常感谢你们的回答。根据Mark的建议,我最终设法使用行和单元格迭代器使其工作,并且它工作正常。我现在有一个单独的问题,但我认为这是我可以解决的。再次感谢。

不确定这是否是您想要的,但是

<?php
# Given this array
$arrays = array(
    'foo' => array(
        0 => 250, 
        1 => 247, 
        2 => 279, 
        3 => 249
    ), 
    'bar' => array(
        0 => 'AM PROV', 
        1 => 'AM PROV', 
        2 => 'AM PENS', 
        3 => 'AM PROV'
    ), 
    'schoo' => array(
        0 => 'xxxx', 
        1 => 'yyy', 
        2 => 'zzz', 
        3 => 'aaa'
    )
);

# This code generates...
$fields = array();
$inserts = array();

foreach ($arrays as $k => $v) {
    $fields[] = $k;
}

for ($i = 0; $i < count($arrays[$fields[0]]); $i++) {
    $vals = array();

    foreach ($fields as $field) {
        $vals[] = $arrays[$field][$i];
    }

    $inserts[] = 'INSERT INTO (' . implode(',', $fields) . ') VALUES ("' . implode('","', $vals) . '")';
}

# This array
/* $inserts = array(
    'INSERT INTO (foo, bar, schoo) VALUES ("250", "AM PROV", "xxxx")', 
    'INSERT INTO (foo, bar, schoo) VALUES ("247", "AM PROV", "yyy")', 
    'INSERT INTO (foo, bar, schoo) VALUES ("279", "AM PENS", "zzz")', 
    'INSERT INTO (foo, bar, schoo) VALUES ("249", "AM PROV", "aaa")'
); */

var_dump($inserts);

除非您想浪费内存,否则我认为没有理由合并该数组。您可能已经复制了数据。这只是逐行插入数据

$data = array('foo' => array(...), ... );
$fields = array('foo', 'bar', 'schoo');
$c = count($data[$fields[0]));

$base_sql = 'INSERT INTO tbl ('.implode(',', $fields).') VALUES ';

for ($i = 0; $i < $c; ++$i)
{
  $row_data = array();
  foreach ($fields as $field)
     $row_data[] = "'".escape_func($data[$field][$i])."'";

  $sql = $base_sql . '(' . implode(',', $row_data). ')';
  db_query($sql);
}
$data=array('foo'=>array(…),…);
$fields=数组('foo','bar','schoo');
$c=计数($data[$fields[0]);
$base_sql='INSERT-INTO-tbl('.introde(',',$fields)。')VALUES';
对于($i=0;$i<$c;++$i)
{
$row_data=array();
foreach($fields作为$field)
$row_data[]=“””。escape_func($data[$field][$i])。“”;
$sql=$base_-sql.'('.introde(',',$row_-data)。');
数据库查询($sql);
}
我会用事先准备好的陈述


您真的应该尝试找出如何在一次遍历中遍历原始数据集。

您可以使用其中一个奇怪的spl迭代器:


但实际上,这里使用的工具是一个简单的for循环。

不熟悉php,但这不是一个二维数组[][]结构吗?@Kent在php数组中是数组、列表、映射和几乎所有其他数据结构都集成在一起的数组……使用PHPExcel的行和单元格迭代器,甚至RangeTarray()获得所需的数组方法应该非常简单……你有什么问题?@MarkBaker我会再看一遍……但我不知道如何在两个方向上迭代。因此,我的问题的解决方案是这样的。这里有一个在/Tests目录中使用迭代器的示例:28iterator.php……正如我所说,看看toArray()或者工作表的rangeToArray()方法我想这与@powerbugger的答案基本相同,只是从主循环中提取一些东西会稍微优化一些。
<?php
$uberArray = array(
    "foo" => array(
        0 => 250,
        1 => 247,
        2 => 279,
        3 => 249,
    ),
    "bar" => array(
        0 => "AM PROV",
        1 => "AM PROV",
        2 => "AM PENS",
        3 => "AM PROV",
    ),
    "schoo" => array(
        0 =>  "xxxx",
        1 =>  "yyy",
        2 =>  "zzz",
        3 =>  "aaa",
    )
);

$yourMysqlLink = mysql_connect('localhost', 'user', 'pass');
mysql_query('SET NAMES utf8'); // Adjust according to your encoding

$colNames = array_keys($uberArray);
$stringCols = array('bar', 'schoo');
$sqlInsertStr = 'INSERT INTO `your_table` (`'.implode('`, `', $colNames)."`) VALUES \n";

$rows = array();
// Not really for iterating the first array, we just need a loop
foreach ($uberArray[$colNames[0]] as $k => $v) {
    $vals = array();
    foreach ($colNames as $v2) {
        $val = $uberArray[$v2][$k];
        if (in_array($v2, $stringCols)) {
            $val = "'".mysql_real_escape_string($val, $yourMysqlLink)."'";
        }
        $vals[] = $val;
    }
    $rows[] = "\t(".implode(', ', $vals).")";
}
$sqlInsertStr .= implode(",\n", $rows).';';

echo '<pre style="clear:both;">'.$sqlInsertStr.'</pre>'; ;
$data = array('foo' => array(...), ... );
$fields = array('foo', 'bar', 'schoo');
$c = count($data[$fields[0]));

$base_sql = 'INSERT INTO tbl ('.implode(',', $fields).') VALUES ';

for ($i = 0; $i < $c; ++$i)
{
  $row_data = array();
  foreach ($fields as $field)
     $row_data[] = "'".escape_func($data[$field][$i])."'";

  $sql = $base_sql . '(' . implode(',', $row_data). ')';
  db_query($sql);
}
$iter = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
foreach ($uberArray as $colName => $colValues) {
    $iter->attachIterator(new ArrayIterator($colValues), $colName);
}

foreach ($iter as $vals) {
    print_r($vals);
    //or $pdoStmt->execute($vals);
}