【问题标题】:Prevent array overwriting and instead create new array index防止数组覆盖,而是创建新的数组索引
【发布时间】:2014-08-27 11:45:22
【问题描述】:

我有一个文件,我需要将文件的内容保存在我的 MySQL 数据库中。这是我用来解析文件的代码:

$lines = file($tmp_filename);
$data = array();
if (($handle = fopen($tmp_filename, 'r')) !== FALSE)
{
  while (($row = fgetcsv($handle, 1000, ";", "\"", "\n")) !== FALSE)
    {
      $key = array_shift($row);
      $data[$key] = $row;
    }
  fclose($handle);
}

这是我正在解析的文件的内容:

HDR;Payroll Interface;5496;2012-07-20
NM1;082;IN2;12345678;2001-01-15;Mr;Marcial;Gustav;Gustav,Marcial;PRI;Marcial
PR1;082;IN2;12345678;7 The School;Alvarez;Bahaghari; ;Gandum
PR2;082;IN2;12345678;400006;IND;M;M;2007-10-16;1976-03-31
PR3;082;IN2;12345678; ; ;A;
**truncated**

Click Here for full data

在某些情况下,数组具有相同的索引和相同的值,但我仍然需要保存这些数据,但会发生数组覆盖。必须添加什么才能将相同的数组放入不同的数组索引?

Take a look at this and tell me what i am missing

【问题讨论】:

  • 如果您担心$row 会丢失,因为可能有两个$keys,那么为什么不保留一个内部计数器而不是使用$key 作为索引呢?前任。 $data[$count++] = $row;$count = 0;.
  • @DaveChen 我编辑了我的帖子,请查看我的问题的链接和底部。谢谢:)
  • 那么重复的会被放在另一个数组中吗?
  • 是的...重复的应该放在另一个数组中,这样我就可以同时保存它们
  • 为什么不改变保存它们的方式?您始终可以将 NM1 放在数组本身中,因此您可以使用常规数字作为索引。我假设您正在使用foreach ($array1 as $index => $el) 之类的东西来保存,这就是您要保留索引的原因。问题是您需要处理更多的重复数组。

标签: php mysql arrays


【解决方案1】:

数组中的数据正在被覆盖,因为您每次遇到$key 的值时都会重新分配它。

您要做的是创建一个二级数​​组作为 $key 值并将节点推送到该数组中,这样您就可以得到预期的结果。

[
    'NM1' => ['...', '...'],
    'PR1' => ['...', '...']
]

代码是,

while (($row = fgetcsv($handle, 1000, ";", "\"", "\n")) !== FALSE) {
    $key = array_shift($row);
    // Notice the extra []
    $data[$key][] = $row;
}

现在每个键都将包含一个数组,其中遇到的每一行都有一个节点。

【讨论】:

  • 在我的工作中被卡在 5.3 告诉我们的服务器主机可以更新 MySql,这与 PDO 处理数据库密码加密的方式有关,但我在本地有 5.4,仅供参考,它将是 = array( ) 在 5.3 中,闭包和 $this 让我在 5.3 中了解我的意思。
  • if (!isset($data[$key])) $data[$key] = []; 另一方面,它给 mu 这个错误Parse error: syntax error, unexpected '['
  • 您使用的是低于 PHP 5.4 的版本吗?正如@ArtisiticPhoenix 指出的那样,对于少于 5.4 个用户,$data[$key] = [] 应该是 $data[$key] = array();。我已经更新了我的答案,因此它与 PHP 兼容
【解决方案2】:

尝试改变:

...
$data[$key] = $row;

...
$data[][$key] = $row;

【讨论】:

  • 感谢您回答这个问题。请参阅我的问题底部的链接。在那里说明了所需输出的外观。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2014-10-25
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多