我有一个关于如何将数组传递给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)
,但错误仍然存在。
答案 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()
作为排序过程的回调函数。然后,我将这个回调函数更改为正确的函数,并解决了问题。
感谢所有回答并给我一些解决方法的人。