Arrays 将张贴的多个阵列转换为codeigniter';s插入批处理样式

Arrays 将张贴的多个阵列转换为codeigniter';s插入批处理样式,arrays,forms,codeigniter,batch-file,multilingual,Arrays,Forms,Codeigniter,Batch File,Multilingual,我正在尝试使用Codeigniter创建多语言形式 我有一个POST数组,如下所示: Array ( [title] => Array ( [en] => English Title [de] => German Title ) [url] => Array ( [en] => English URL [de] => German URL ) ) 我想将

我正在尝试使用Codeigniter创建多语言形式

我有一个POST数组,如下所示:

Array
(
  [title] => Array
    (
        [en] => English Title
        [de] => German Title
    )

  [url] => Array
    (
        [en] => English URL
        [de] => German URL
    )
)
我想将其转换为codeigniter
insert\u batch('tablename',$data)
格式,如:

Array
(
  [0] => Array
    (
        [lang] => en
        [title] => English Title
        [url] => English URL
    )

  [1] => Array
    (
       [lang] => de  // Assuming user didn't fill `_de` labeled input fields.
       [title] => 
       [url] =>
    )
) 
数据库中存储的数据如下:

|id|lang|    title      |    url      |
|--|----|---------------|-------------|
|  | en | English Title | English URL |
---------------------------------------
我怎样才能做到这一点?我需要将post数组转换为
insert\u batch
的数据数组样式。上面,
array[1]
只包含前缀为
lang
的as
de
。所以
array[1]
对我来说是空的。因此,我还需要从final
$data
中删除空数组

在下面,您将找到查看文件

<div id="tabs">
  <?php echo form_open('controller/post_target',array('name'=>'add_page')); ?>
  <ul>
    <?php foreach($lang_data as $r):?>
    <li><a href="#tab_<?=$r->lang;?>"><?=$r->name;?></a></li>
    <?php endforeach; ?>        
  </ul>

  <?php foreach($query_lang as $r):?>
  <div id="tab_<?=$r->lang;?>">
    <?php echo form_label('Page Title','title'); ?>
    <?php 
      $attr1 = array('name' => 'title[' . $r->lang . ']');
      echo form_input($attr1); 

      $attr2 = array(name' => 'url[' . $r->lang . ']');
      echo form_input($attr2); 
    ?>
  </div>
  <?php endforeach; ?>
    <?php echo form_submit('submit','Save'); ?>
  <?php echo form_close(); ?>
</div>


您可以创建一些函数来实现这一点。由于
lang
属性具有特殊的行为(与title或url不同),因此我认为最好在数组中定义语言

我在下面创建了两个函数,第一个函数将输入数据转换为批插入所需的格式,第二个函数删除空行(
lang
),因为它将始终被设置

我建议您使用要翻译的字段手动设置$data,不要传递整个
$\u POST
值。您可能会在将来添加其他未翻译的输入,我建议使用白名单机制来翻译所有输入,而不是黑名单(取消提交按钮)

更新 添加$fields参数作为已翻译字段的列表

$langs = array_keys($post["title"]);
$batch = array();
foreach ($langs as $lang) {
      $tmp = array();
      $tmp["title"] = $post["title"][$lang];
      $tmp["url"] = $post["url"][$lang];
      $batch[] = $tmp;
}

我想,你也可以这样做:


未经测试,也未检查帖子结构中的任何错误。

它工作得非常好。我在模型中添加了函数,然后它就工作了。你介意我问你更多关于白名单而不是unset['submitBuyyonName']的问题吗?在将来的情况下,使用白名单的想法有一些好处,在这种情况下,您可能会添加新字段,而这些字段不是
来翻译表单中的
(例如,一个标记url为活动的复选框)。另一个方面涉及到安全性:您需要从提交的表单中提取所需的值,而不是将所有内容保存到数据库中。如果您有任何问题,请随时向Hanks寻求帮助。复选框正是我昨天评论的原因:)也许我应该提出一个新的问题,但基本上,如果你有时间的话,基本功能应该是如何白名单选定的数组元素。再次谢谢。嗨。我更新了代码,并在函数
为插入准备数据
中添加了参数
$fields
。此参数应包含一个包含要转换的字段的数组,以便忽略其他字段(如复选框或提交值)。这就是我所说的创建一个包含要翻译的字段的白名单的意思。我希望它能帮你大忙。非常感谢您的贡献@mazzucci。谢谢您的回复。。。马祖奇的方式给了我更多的家的感觉。
$data = prepare_data_for_insert($data, array('title', 'url'), array('en', 'de'));
var_dump($data);
$data = remove_empty_rows($data, array('lang'));
var_dump($data);

function prepare_data_for_insert($data, $fields, $langs) {
    $result = array();

    $i = 0;
    // foreach language defined
    foreach ($langs as $lang) {
        // set the languge
        $result[$i]['lang'] = $lang;
        // foreach field that we want to translate
        foreach ($fields as $field) {
            // set the value for the current language
            $result[$i][$field] = $data[$field][$lang];
        }
        $i++;
    }

    return $result;
}

function remove_empty_rows($data, $ignore_fields = array()) {
    $result = array();

    // result
    foreach ($data as $item) {
        $has_values = false;
        foreach ($item as $key => $value) {
            // check if the key is ignored
            if (in_array($key, $ignore_fields)) {
                continue;
            }

            // if a value was set
            if ($value != '') {
                // the array has values
                $has_values = true;
                // don't search for other values
                break;
            }
        }

        // if the array has values
        if ($has_values) {
            // save the row in the result
            $result[] = $item;
        }
    }

    return $result;
}
$langs = array_keys($post["title"]);
$batch = array();
foreach ($langs as $lang) {
      $tmp = array();
      $tmp["title"] = $post["title"][$lang];
      $tmp["url"] = $post["url"][$lang];
      $batch[] = $tmp;
}