【问题标题】:trouble with array_merge, serialize and unserialize in phpphp中array_merge、序列化和反序列化的问题
【发布时间】:2014-03-28 22:20:18
【问题描述】:

我必须这样做:

  1. 获取一个关联数组并将其插入到我的数据库中的一个字段中,这样我就可以将它重新用作关联数组。 [使用序列化($associativeArray)完成]
  2. 从数据库中获取关联数组并作为数组查看。 [通过unserialize($arraySerializedBefore) 完成]
  3. 将数据库中已存在的数组(序列化)与刚刚创建的数组合并。

例如:

Array 
( 
  [1] => 'nanananana,lol,',
  [2] => 'laaaaalalalala,asd,',
  [3] => 'r0tfl,lmfao,ahah,'
)

要与第一个合并的第二个数组:

Array 
( 
  [1] => 'dunnoWhat,write,',
  [3] => 'hello,wooorld,'
)

所以我需要一个像这样的最终数组:

Array 
( 
  [1] => 'nanananana,lol,\N,dunnoWhat,write,',
  [2] => 'laaaaalalalala,asd,',
  [3] => 'r0tfl,lmfao,ahah,\N,hello,wooorld,'
)

如果您看到它使用密钥合并它,如果它们具有相同的密钥,它会添加一个“\n”以进入新行(与 BR 标记相同......这只是一个示例)并在它之后将第二个数组对应的字符串添加到键。但是,如果您不理解,请观看示例,您会的。 谢谢

【问题讨论】:

  • 第二个数组中有没有可能出现在第一个数组中的键?这个例子并没有拒绝这个想法。

标签: php arrays merge array-merge


【解决方案1】:

我只是想知道是否可以使用一个功能块(如函数式编程)来解决。它是:

$foo = [
   0 => "test zero",
   1 => "test one",
   2 => "test two",
   3 => "test three"
];

$bar = [
   1 => "test four",
   5 => "test five",
   3 => "test six",
   4 => "test seven"
];

$result = 
   array_diff_key($foo, $bar)
   +
   array_combine(
      $y = array_keys(array_intersect_key($foo, $bar)), 
      array_map(function($x) use ($foo, $bar)
      {
         return $foo[$x]."\n".$bar[$x];
      }, $y)
   )
   +
   array_diff_key($bar, $foo);

【讨论】:

  • 似乎 5 个不同的数组函数过大了 ;)
  • “我只是想知道是否可以用一个功能块来解决”
  • @AlmaDo 你错过了逗号,你的钥匙也没有按顺序。
  • @ICanHasCheezburger 什么逗号?
  • 我没有错过逗号,因为 '它添加了一个 "\n" 来换行' OP 说。而且我没有错过订单,因为对此没有任何说明(并且在合并具有不同键的数组时应该是什么并不明显)
【解决方案2】:

使用foreach 遍历第二个数组并将其键与第一个数组的键匹配,如果找到匹配项,则通过连接更新第一个数组。

<?php

$arr1=Array(1 => 'nanananana,lol,',2 => 'laaaaalalalala,asd,',3 => 'r0tfl,lmfao,ahah,');
$arr2=Array(1 => 'dunnoWhat,write,',3 => 'hello,wooorld,');

$i=min(array_keys($arr1));
foreach($arr2 as $k=>$val)
{
    if(array_key_exists($k,$arr1))
    {
    $arr1[$k].='\N, '.$val;
    }

}
print_r($arr1);

OUTPUT :

Array
(
    [1] => nanananana,lol,\N, dunnoWhat,write,
    [2] => laaaaalalalala,asd,
    [3] => r0tfl,lmfao,ahah,\N, hello,wooorld,
)

【讨论】:

  • 这将失败,顺便说一句 - 如果有不存在的键(如在我的示例中)。比较这个invalid 结果和这个expected 结果
  • @AlmaDo,结果如何invalid?如果第一个数组的键与第二个数组的键匹配,OP 希望更新第一个数组。
  • 好吧,在不存在键的情况下无效。 OP没有提到他们是否可能。因此,我发现这种情况是无效的行为。所以如果这种情况不会出现,上面的代码就可以正常工作了
  • @ShankarDamodaran,Alma Do 是对的,如果我在第二个数组中使用键 5(使用我的示例),它会给我错误。如何? Alma Do 的例子不太好,因为它没有对最终数组进行排序。 (5 不早于 4..)
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多