43

如果我array_walk在类函数内部使用来调用同一类的另一个函数

class user
{
   public function getUserFields($userIdsArray,$fieldsArray)
   {

     if((isNonEmptyArray($userIdsArray)) && (isNonEmptyArray($fieldsArray)))
     {
         array_walk($fieldsArray, 'test_print');
     }
   }


  private function test_print($item, $key)
  {
         //replace the $item if it matches something
  }

}

它给了我以下错误-

警告: array_walk()[function.array-walk]:无法调用 test_print()- 函数在...中不存在

那么,如何$this->test_print()在使用时指定array_walk()

4

5 回答 5

91

如果要将类方法指定为回调,则需要指定它所属的对象:

array_walk($fieldsArray, array($this, 'test_print'));

手册

实例化对象的方法作为数组传递,该数组包含索引 0 处的对象和索引 1 处的方法名称。

于 2010-10-01T14:52:40.067 回答
7

如果您需要在不实例化类的情况下调用静态方法,您可以这样做:

// since PHP 5.3
array_walk($fieldsArray, 'self::test_print');

或从外部:

// since PHP 5.5
array_walk($fieldsArray, User::class.'::test_print');
于 2016-09-07T16:53:46.403 回答
3

要在另一个类方法中调用一个类方法作为回调函数,你应该这样做:

public function compareFucntion() {
}

public function useCompareFunction() {
  usort($arrayToSort, [$this, 'compareFucntion'])
}
于 2017-06-28T15:04:48.377 回答
0

这是在多维数组中查找特定键并返回其值的类:

class Find_value_by_key  {
  protected $look_by_key;
  protected $look_in_array = array();
  public $result_value;

  public function get_array($look_in_array, $look_by_key) {
    $this->look_by_key = $look_by_key;
    $this->look_in_array = $look_in_array;
    $this->run_walk_through_array($this->look_in_array);

  }

  protected function walk_through_array($value, $key) {

    if (is_array($value)) {
      if ($key === $this->look_by_key) {
        $this->result_value = $value;
      } else {
        array_walk($value,[$this,'walk_through_array']);
      }
    } 

  }

  protected function run_walk_through_array($look_in_array) {
    array_walk($look_in_array,[$this,'walk_through_array']);
  }

} 

您需要将 Array 和特定的 Key 传递给 get_array()。然后调用 $result_value:

$this->load->library('find_value_by_key');
$this->find_value_by_key->get_array($my_array, 'my_key');
$key_Value = $this->find_value_by_key->result_value;
于 2021-09-23T17:42:00.450 回答
0

以下是执行回调函数的四个示例。
如果您像我一样,其中之一对您来说将是最直观的。
仔细看看 $callable 在每个中的定义方式的差异。重要的是要记住 array_walk() 返回一个布尔值。

<?php

namespace App\MiscTests;

class User
{
    protected $fieldsArray = [];
    protected $result = "";

    public function setUserFields(array $fieldsArray)
    {
        $this->fieldsArray = $fieldsArray;
    }

    public function getResult()
    {
        return $this->result;
    }

    private function test_printOne($item, $key)
    {
        echo $key.$item;
        $this->result = $key.$item;
    }

    private function test_printTwo(){
        $callThis = function ($item, $key){
            echo $key.$item;
            $this->result = $key.$item;
        };
        return $callThis;
    } 

    public function callbackMethodOne()
    {                
        $callable = array($this, 'test_printOne');
        return array_walk($this->fieldsArray, $callable, null);
    }

    public function callbackMethodTwo()
    {        
        $callable = $this->test_printTwo();
        return array_walk($this->fieldsArray, $callable, null);
    }

    public function callbackMethodThree()
    {
        $callable = function ($item, $key){
            echo $key.$item;
            $this->result = $key.$item;
        };
        return array_walk($this->fieldsArray, $callable, null);
    }

    public function callbackMethodAnonymous()
    {
        return array_walk($this->fieldsArray, function ($item, $key){
            echo $key.$item;
            $this->result = $key.$item;
        }, null);
    }

}
?>

这是我使用的单元测试:

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class MiscUserTest extends TestCase
{
    /**
     * This will test the User class
     *
     * @return void
     */
    public function test_print_with_callback_method_one()
    {
        $userObject = new \App\MiscTests\User;
        $userObject->setUserFields(['Foo'=>'Bar1']);
        $this->assertEquals(1, $userObject->callbackMethodOne());
        $result = $userObject->getResult();
        $this->assertEquals(0, strcmp('FooBar1', $result));
    }

    public function test_print_with_callback_method_two()
    {
        $userObject = new \App\MiscTests\User;
        $userObject->setUserFields(['Foo'=>'Bar2']);
        $this->assertEquals(1, $userObject->callbackMethodTwo());
        $result = $userObject->getResult();
        $this->assertEquals(0, strcmp('FooBar2', $result));
    }

    public function test_print_with_callback_method_three()
    {
        $userObject = new \App\MiscTests\User;
        $userObject->setUserFields(['Foo'=>'Bar3']);
        $this->assertEquals(1, $userObject->callbackMethodThree());
        $result = $userObject->getResult();
        $this->assertEquals(0, strcmp('FooBar3', $result));
    }

    public function test_print_with_callback_method_anonymous()
    {
        $userObject = new \App\MiscTests\User;
        $userObject->setUserFields(['Foo'=>'Bar4']);
        $this->assertEquals(1, $userObject->callbackMethodAnonymous());
        $result = $userObject->getResult();
        $this->assertEquals(0, strcmp('FooBar4', $result));
    }

}
于 2022-02-19T18:17:40.383 回答