如何使用array_walk更改元素的值



如何使用array_walk更改元素的

例如,这是我的数组

$items = array(
    0 => array( 
        "id" => "1",
        "title" => "parent 1",
       "children" => array()
        ),
    1 => array( 
        "id" => "2",
        "title" => "parent 2",
        "children" => array (
           0 => array( 
            "id" => "4",
            "title" => "children 1"
            ),
           1 => array( 
            "id" => "5",
            "title" => "children 2"
            ) 
        ),
   )
);

我可以用下面的这个来改变它,

function myfunction(&$item,$key)
{
    if($item['id'] === '1')
    {
        $item['title'] = 'hello world en';
    }   
}

array_walk($items,"myfunction");
print_r($items);

但我有一个嵌套的子项,我也想更改其中的值,如果我这样做,我会出错,

function myfunction(&$item,$key)
{
    if($item['id'] === '1')
    {
        $item['title'] = 'hello world en';
    }
    if($item['id'] === '4')
    {
        $item['title'] = 'hello world en';
    }

    foreach($item as $key => $value)
    {
        if(is_array($value))
        {
            myfunction($value,$key);
        }
    }
}

错误,

注意:未定义的索引:id在。。。第xx行的index.php

知道如果数组中有嵌套的子级该怎么办吗?

您可以通过递归调用回调函数来实现这一点。我已经实现了带有闭包的示例,比如:

//replacement array:
$replace = [
  '1' => 'foo',
  '2' => 'bar',
  '5' => 'baz'
];
array_walk($items, $f=function(&$value, $key) use (&$f, $replace)
{
   if(isset($replace[$value['id']]))
   {
      $value['title'] = $replace[$value['id']];
   }
   if(isset($value['children']))
   {
      //the loop which is failing in question:
      foreach($value['children'] as $k=>&$child)
      {
         $f($child, $k);
      }
      //Proper usage would be - to take advantage of $f
      //array_walk($value['children'], $f);
   }
});

正如您所看到的,您所需要的只是通过引用传递值,并在回调中迭代它作为foreach的引用。

当您添加一行(如if (!isSet($item['id'])) var_dump($item);(时,您将看到为什么会得到未定义的索引。

虽然我不确定你为什么要这样做(你是如何利用array_walk()的?(,但要解决这个问题,你可以使用以下方法:

function myfunction(&$item,$key)
{
    if ($item['id'] === '1')
    {
        $item['title'] = 'hello world en';
    }
    if ($item['id'] === '4')
    {
        $item['title'] = 'hello world en';
    }

    if (isSet($item['children']) && is_array($item['children']))
        array_walk($item['children'], __FUNCTION__);
}

这将适用于给定的示例。

foreach($item as $key => $value)
{
    if(is_array($value))
    {
        myfunction($value,$key);
    }
}

您遍历$item中的每个键(id、title、children(。但我想你想要的是遍历$value['children'](value['children'][0],value['hildren'][1](的每个ELEMENT,对吧?所以它可能是这样的:

if(is_array($value)){
   foreach($item['children'] as $key => $value){
      myfunction($value,$key);
   }
}

问题是您传递的是整个子数组,而不是每个单独的子项。查看此eval的外观。这是代码:

<?php
$items = array(
    0 => array( 
        "id" => "1",
        "title" => "parent 1",
        "children" => array()
    ),
    1 => array( 
        "id" => "2",
        "title" => "parent 2",
        "children" => array (
           0 => array( 
            "id" => "4",
            "title" => "children 1"
            ),
           1 => array( 
            "id" => "5",
            "title" => "children 2"
            ) 
        ),
   )
);
function myfunction(&$item) {
  if($item['id'] == '1' || $item['id'] == '4') {
    $item['title'] = 'hello world en';
  }
  if( ! empty($item['children'])) {
    array_walk($item['children'], "myfunction");
  }
}
array_walk($items, "myfunction");
var_dump($items);

在您发布的代码中,您没有通过foreach传递引用。这应该适用于您发布的代码。

foreach($item as $key => &$value)
{
    if(is_array($value)) {
        myfunction($value,$key);
    }
}

如果你看不到未定义的索引,只需在比较值之前检查是否设置了:

if(isset($item['id'])){
    if($item['id'] === '1'){
      ...
    }
}

在线示例

相关内容

  • 没有找到相关文章

最新更新