2014-01-10 29 views
0

我一直在淘汰SO今天下午为我的用例可行的解决方案。我没有找到它。php - 减少多维数组以查询字符串

使用案例:将数组转换为格式,使得在PDO插入语句中,数组键是列,数组值是SQL值。如果这个请求重复其他人,我很抱歉。我没有找到一个适合我的人。在我的例子中,父数组是Array[0],它被插入到一个表中,Array[1]是孩子。它们被迭代并插入另一个表中,其中fk_user_id作为外键。

例插入: $sth = $dbh->prepare("INSERT INTO $table ($colData) VALUES ($valData)");

所以,列将(key1, key2)和值将是(:value1, :value2)等。我在所有多维性各种各样的问题和提取子节点,等等,等等

样品阵列:

[INFO] Array 
(
    [0] => Array 
     (
      [last_visit] => 1389393273.19 
      [first_visit] => 1389313338.69 
      [this_visit] => 1389393265.75 
      [latitude] => 37.7858352661 
      [longitude] => -122.406417847 
      [opted_out] => 0 
      [opted_in] => 0 
      [user_id] => 1 
      [locale] => en 
      [device_maker] => unknown 
      [device_model] => Simulator 
      [os_platform] => iPhone OS 
      [os_version] => 7.0.3 
      [modified] => 1389393273.19 
      [model_type] => tracker 
     ) 
    [1] => Array 
     (
      [0] => Array 
       (
        [view_count] => 1 
        [visit_timestamp] => 1389393265.63 
        [page_viewed] => home 
        [page_id] => 320 
        [fk_user_id] => 1 
        [model_type] => page 
       ) 
      [1] => Array 
       (
        [view_count] => 2 
        [visit_timestamp] => 1389393265.64 
        [page_viewed] => contactView 
        [page_id] => 321 
        [fk_user_id] => 1 
        [model_type] => page 
       ) 

     ) 
) 

解决方案我已经试过 Remove parent - keep childrenRemove key from associative arrayIterating over an arrayFlatten array等。我可能在代码中如此之深以至于我失去了对数据的看法。由于我使用PHP工作了很长时间,所以我的技能需要刷新。非常感谢您的帮助。

+0

有最多两个维度或者是孩子的无限量可能吗? – thpl

+0

你有没有考虑过json_encode?它不像它可能的那么紧凑,但可以满足你的目的。 –

回答

1

我已经为您考虑了一个可能的解决方案,也正在考虑走槽多维数组(无限量的孩子)。

该解决方案是一个基于递归的函数,并返回一个数组,其中包含需要插入数据库的列(cols),行和包含子元素的数组。

您可以遍历输出数组或静态地使用它的某些元素。 看看它。

<?php 

$arr = array(
    'key1' => 'val1', 
    'key2' => 'val2', 
    'key3' => 'val3', 
    'key4' => array(
    'subkey1' => 'subval1', 
    'subkey2' => 'subval2',  
) 
); 

function walkArray($input) 
{ 
    // Define our output array 
    $output = array(
     'keys' => '', 
     'vals' => '', 
     'children' => array(), 
    ); 

    // We're looping trough the input array 
    foreach($input AS $key => $value) 
    { 
     // If the current value is an array we reached the next dimension 
     if(is_array($value)) 
     { 
     // So we call walkArray() recursively with our current value 
     // and assign the returned array to a new element in our $output's 'children' key 
     $output['children'][] = walkArray($value); 
     } 
     else 
     { 
     // We'll concatenate our keys and values... 
     $output['keys'] .= $key . ', '; 
     $output['vals'] .= ':' . $value .', '; 
     } 
    } 

    // And get rid of the trailing commas 
    $output['keys'] = rtrim($output['keys'], ', '); 
    $output['vals'] = rtrim($output['vals'], ', '); 

    // Eventually we return our output array 
    return $output; 
} 

?> 

<pre> 
    <?php 
    print_r(walkArray($arr)); 
    ?> 
</pre> 

输出将是:

Array 
(
    [keys] => key1, key2, key3 
    [vals] => :val1, :val2, :val3 
    [children] => Array 
     (
      [0] => Array 
       (
        [keys] => subkey1, subkey2 
        [vals] => :subval1, :subval2 
        [children] => Array 
         (
         ) 

       ) 

     ) 

)  
+0

我会测试这个。如果它适合我​​,我会标记为最佳答案。谢谢,托马斯。 –

+0

它按照描述工作。做得很好,谢谢你。 –

0

从安全的角度来看,以这种方式动态地将表单输入映射到SQL列是一个可怕的想法。任何人都可以通过构建匹配的POST请求来将任何数据转储到任何列。

此外,通过将表单值直接插入到SQL字符串中,您很容易受到SQL注入的影响。任何人都可以提交虚假的POST请求并执行任意SQL,这些SQL会暴露或破坏数据库中的任何表。

随着该警告报错,你要的是使用PHP的foreach

http://www.php.net/manual/en/control-structures.foreach.php

foreach ($main_record as $column_name => $column_value) { 
    ... 
} 

在循环中,你将不得不建立两个字符串在第一个记录键遍历在每次迭代中。第一个包含列名(表名后面的逗号分隔列表)。第二个包含值。

之后,你将不得不得到最后插入记录的ID,PDO有一个功能。然后,您必须为每个关联记录重复此技巧。

如果您想要更好的解决方案,请考虑使用像Laravel这样的框架,其中包括一个名为Eloquent ORM的对象关系映射程序库。它将使这些操作更简单,更安全地编程。

+1

你怎么知道OP试图将表单输入映射到数据库中? – thpl

+0

谢谢@Niels。这是一个移动应用程序的后端PHP web服务。不会有任何访问URL的权限。而且,幸运的是,我想我发布我的请求后立即找到了我的答案。 [如何插入数组键作为列](http://stackoverflow.com/questions/19045692/how-to-insert-array-key-as-table-column-and-value-as-column-value-into- mysql-usi) –

+0

@ThomasDavidPlat你是正确的。这不是表格数据。 –