【问题标题】:Changing keys using array_map on multidimensional arrays using PHP使用 PHP 在多维数组上使用 array_map 更改键
【发布时间】:2014-04-17 08:10:15
【问题描述】:

我使用 array_merge() 合并了 2 个具有相同信息但具有不同键的多维数组,我得到了输出:

   Array
   (
    [0] => Array
    (
        [Ttitle] => lilly
        [Price] => 1.75
        [Number] => 3
    )
    [1] => Array
    (
        [Title] => rose
        [Price] => 1.25
        [Number] => 15
    )
    [2] => Array
    (
        [Title] => daisy
        [Price] => 0.75
        [Number] => 25
    )
    [3] => Array
    (
        [Title] => nettle
        [Price] => 2.75
        [Number] => 33
    )
    [4] => Array
    (
        [Title] => orchid
        [Price] => 1.15
        [Number] => 7
    )
  )

如您所见,数组中的第一个键名是Ttitle,其余的是Title。我现在想要的是将所有Ttitle 键(目前只有一个)更改为Title(就像所有其他键一样)。当我使用array_map() 功能时,我设法将所有键更改为Title,但我也删除了所有Title 值,除了我刚刚更改为TtitleTtitle 键。

代码如下:

   if(! empty($notmatchingarray))
   {
    $completearray = array_merge($notmatchingarray, $datastuff2);

    $completearray = array_map(function($complete) {
        return array(
           'Title' => $complete['Ttitle'],
           'Price' => $complete['Price'],
           'Number' => $complete['Number'],
       );
}, $completearray);

echo "Array which includes each unique enrty from both arrays";
echo "<pre>";
print_r($completearray);
echo "</pre>";
echo "<br/>";
   }

这段代码的输出:

  Array
  (
  [0] => Array
    (
        [Title] => lilly
        [Price] => 1.75
        [Number] => 3
    )
  [1] => Array
    (
        [Title] => 
        [Price] => 1.25
        [Number] => 15
    )
  [2] => Array
    (
        [Title] => 
        [Price] => 0.75
        [Number] => 25
    )
  [3] => Array
    (
        [Title] => 
        [Price] => 2.75
        [Number] => 33
    )
  [4] => Array
    (
        [Title] => 
        [Price] => 1.15
        [Number] => 7
    )
  )

我在使用这个array_map() 函数时做错了吗?我应该做其他事情吗?

【问题讨论】:

    标签: php arrays multidimensional-array key


    【解决方案1】:

    更好的方法,但我要走了。使用您现有的代码,您需要设置TtitleTitle,以存在者为准:

    $completearray = array_map(function($complete) {
            $title = isset($complete['Ttitle']) ? $complete['Ttitle'] : $complete['Title'];
            return array(
               'Title' => $title,
               'Price' => $complete['Price'],
               'Number' => $complete['Number'],
           );
    }, $completearray);
    

    Ternary operator 是一个简单的if / else 的快捷方式,所以:

    if(isset($complete['Ttitle'])) {
        $title = $complete['Ttitle']; //if Ttitle is set use it
    } else {
        $title = $complete['Title'];  //if not use Title
    }
    

    【讨论】:

    • 再次感谢您的帮助,立即生效。 $title 变量是否基本上说明 $complete 中的 Key 是否为 Ttitle,然后将 $complete['Ttitle'] 与 $complete['Title'] 交换。如果我拥有所有名称不同但值相似的键,我可以使用相同的原则来更改所有键吗?
    • @Mike 不,它不会交换值。 ?:ternary operator(也称为条件运算符)。它基本上是 if/else 语句的紧凑版本。
    【解决方案2】:

    您可以尝试使用array_key_exists 函数:

    $completearray = array_map(function($complete) {
        return array(
           'Title' => (array_key_exists('Title', $complete) 
                       ? $complete['Title'] 
                       : $complete['Ttitle']),
           'Price' => $complete['Price'],
           'Number' => $complete['Number'],
       );
    }, $completearray);
    

    或者,如果您愿意:

    $completearray = array_map(function($complete) {
        $titleKey = array_key_exists('Title', $complete) ? 'Title' : 'Ttitle';
        return array(
           'Title' => $complete[$titleKey],
           'Price' => $complete['Price'],
           'Number' => $complete['Number'],
       );
    }, $completearray);
    

    如果数组$complete 包含键'Title',它将使用它;否则它将使用密钥'Ttitle'

    【讨论】:

    • @Mike 没用怎么办?你收到错误了吗?我在最初的回答中遇到了问题(in_array 而不是array_key_exists),但我已经更正了。请查看我的更新答案。
    • 啊,它现在可以工作了,我必须开枪了。很大的帮助谢谢!如果多维数组有更多不同的键名,我是否可以在理论上对此进行扩展以将所有键更改为特定名称。?
    • @Mike 当然。你可以很容易地调整第二个例子。您甚至可以创建一个键数组,然后选择找到的第一个键。无论您想采用哪种方式,找到正确的密钥并将其分配给$titleKey。您的退货声明将保持不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2011-05-04
    • 2014-07-21
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多