मेरे पास एक प्रश्न है कि PHP में किसी फ़ंक्शन में सरणी कैसे पास करें। मेरे पास "MyClass" नामक एक वर्ग है और इसके अंदर rankVal($arr1, $arr2) और processResponse($data, $db, $id, $lat, $lng) नामक कार्य हैं।

ProcessResponse() रैंकवैल() को कॉल करेगा और यहाँ मेरी समस्या है।

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);
   }
}

जब मैंने प्रक्रिया रेस्पॉन्स() फ़ंक्शन को कॉल किया तो मुझे यह त्रुटि मिली: 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) में "&" जोड़कर संदर्भ द्वारा सरणी को पारित करने का प्रयास किया, लेकिन त्रुटि अभी भी है।

-1
zangetsKid 29 अप्रैल 2016, 14:31

2 जवाब

सबसे बढ़िया उत्तर

तो मेरे कोड को दोबारा जांचने के बाद, मुझे अंततः उस समस्या का पता चला जो इस अजीब बग का कारण बन रहा था जिसे वहां नहीं होना चाहिए था।

अपराधी rankVal() फ़ंक्शन में है जहां मैंने usort() को कॉल किया, जो सॉर्टिंग प्रक्रिया के लिए कॉलबैक फ़ंक्शन के रूप में rankVal() का उपयोग करता था। फिर, मैंने इस कॉलबैक फ़ंक्शन को दाईं ओर बदल दिया, और वॉइला समस्या हल हो गई।

उन सभी के लिए धन्यवाद जिन्होंने उत्तर दिया था और मुझे इसे ठीक करने के बारे में कुछ सुझाव दिए थे।

0
zangetsKid 30 अप्रैल 2016, 13:39

यहां दूसरे उत्तर में जोड़ने के लिए (जो अब चला गया लगता है), यदि आप चाहते हैं कि आपकी कक्षा एक सरणी के रूप में व्यवहार करे जहां उपयुक्त हो, तो आपको इसे चलने योग्य बनाने की आवश्यकता है।

आपको केवल 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 );
    }

}

एक बार आपके पास यह हो जाने के बाद, इसका उपयोग कहीं भी किया जा सकता है जहां आप किसी सरणी का उपयोग कर सकते हैं।

0
DevDonkey 29 अप्रैल 2016, 14:47