array_walk_recursive似乎不起作用

时间:2011-10-26 20:01:40

标签: php

我想将一个函数应用于一个对象的每个元素/ prop,但似乎array_walk_recursive()对对象不起作用。即:

if( $re = $con->query("SELECT id, created_date, contents FROM " . 
                      POST_DATA . " WHERE type = 'news' ORDER BY ".
                      "created_date DESC LIMIT $amount") ) {
    if( $re->num_rows != 0 ) {
        while( $ob = $re->fetch_object() ) {
            $ob = array_walk_recursive( $ob, "_output" );
            print_r($ob);
            die();
        }
    }
}

只会返回'1'。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

它实际上为True返回array_walk_recursive的值。如果查看函数documentation,您会看到此方法正在执行的操作是为每个项调用函数_output并键入对象。

你应该有一些看起来与此类似的代码,我想,为了让它正常工作:

function _output($data, $key) {
    echo "For the key $key, I got the data: ";
    print_r($data);
}

调用_output的位置,因为这是您在array_walk_recursive函数中提供的字符串化名称。这应该将您的值打印到屏幕上。


修改

但是,我似乎并没有真正回答你原本想要做的事情。如果您想将函数应用于数组的每个元素,我建议您查看array_map。您可以像这样使用array_map

function double($item) {
    return 2 * $item;
}

array_map('double', $item);

最终,如果递归是你想要的东西,你可能会做这样的事情:

function callback($key, $value) {
    // do some stuff
}

function array_map_recursive($callback, $array) {
   $new_array = array()
   foreach($array as $key => $value) {
      if (is_array($value)) {
          $new_array[$key] = array_map_recursive($callback, $value);
      } else {
          $new_array[$key] = call_user_func($callback, $key, $value);
      }
   }
   return $new_array;
}

array_map_recursive('callback', $obj);

那将返回另一个像$ obj这样的数组,但是无论回调应该做什么。