将数组传递给PHP类中的函数

时间:2016-04-29 11:31:54

标签: php arrays

我有一个关于如何将数组传递给PHP中的函数的问题。我有一个名为" MyClass"在其内部有称为rankVal($arr1, $arr2)processResponse($data, $db, $id, $lat, $lng)的函数。

processResponse()将调用rankVal(),这是我的问题所在。

class MyClass{
   private function cmpVal($a, $b){
        /*do sorting stuff*/
   }

   function rankVal($arr1, $arr2){
       $arrIdx=[];
       foreach ($arr1 as $key => $value) {
           $n=array_search($value, $arr2);
           $newPos = ($key+$n)/2;
           $arrNewIdx [$n]=round($newPos,0, PHP_ROUND_HALF_DOWN);
       }

   }

   function processResponse($data, $db, $id, $lat, $lng){
       //Do some stuffs here...
       $someArr1 = [];
       foreach($results as $key => $value){
           $newVal = new stdClass();
           $newVal->key1 = $value->key1;
           $newVal->key2 = $value->key2;
           $newVal->key3 = $value->key3;
           $newVal->key4 = $value->key4;
           $newVal->key5 = $value->key5;
           $someArr1 []= $newVal;
       }
       $someArr2 = $someArr1;

       usort($someArr2, array($this, "cmpVal"));
       $rankedVal = $this->rankVal($someArr1, $someArr2);
   }
}

当我调用processResponse()函数时,我收到此错误: array_search() expects parameter 2 to be array, object given

所以,var_dump($arr2)中的rankVal(),输出清楚地表明$ arr2是一个数组。这是var_dump($arr2)的示例输出:

array(30) {
[0]=>
 object(stdClass)#385 (7) {
   ["key1"]=>
   string(24) "something"
   ["key2"]=>
   string(20) "something"
   ["key3"]=>
   string(41) "something"
   ["key4"]=>
   float(1.23455)
   ["key5"]=>
   float(1.19128371983198)
 }

我做错了什么?我试图通过引用传递数组,添加"&"在rankVal(&$arr1, &$arr2),但错误仍然存​​在。

2 个答案:

答案 0 :(得分:0)

  

要添加到此处的其他答案(现在似乎已经消失了),如果您希望您的类在适当的位置表现为数组,则需要使其可迭代。

您需要做的就是实施Iterable。这意味着您需要创建必要的方法,但这就是您所需要的所有方法。

它对于设计用于保存数据数组的类很有用,但是您希望将其他工具与该数据一起封装。

以下是一个例子:

class Row implements \Iterator {
    protected $data;
    protected $position = 0;

    public function __construct( array $data = [ ]) {
        $this->data = $data;

    }

    public function addData( $value ) {
        $this->data[] = $value;
    }

    public function replaceData( $index, $value ) {

        $this->data[ $index ] = $value;
    }

    public function getData() {
        return $this->data;
    }

    public function setData( array $data ) {
        $this->data = $data;

        return $this;
    }

    /** Required by Iterator */
    public function current() {
        return $this->data[ $this->position ];
    }

    /** Required by Iterator */
    public function next() {
        ++$this->position;
    }

    public function __toArray() {
        return $this->data;
    }

    /** Required by Iterator */
    public function key() {
        return $this->position;
    }

    /** Required by Iterator */
    public function valid( $index = null ) {
        return isset( $this->data[ $index ? $index : $this->position ] );
    }

    /** Required by Iterator */
    public function rewind() {
        $this->position = 0;
    }

    public function count() {
        return count( $this->data );
    }

}

一旦你有这个,它可以在任何你可以使用数组的地方使用。

答案 1 :(得分:0)

因此,在再次检查我的代码之后,我终于找到了导致这个奇怪的错误的问题,这个问题不应该存在。

罪魁祸首在rankVal()函数中,我调用了usort(),它使用rankVal()作为排序过程的回调函数。然后,我将这个回调函数更改为正确的函数,并解决了问题。

感谢所有回答并给我一些解决方法的人。