array_map not working in classes

PhpArraysClassFunctionArray Map

Php Problem Overview


I am trying to create a class to handle arrays but I can't seem to get array_map() to work in it.

<?php
//Create the test array
$array = array(1,2,3,4,5,6,7,8,9,10);
//create the test class
class test {
//variable to save array inside class
public $classarray;

//function to call array_map function with the given array
public function adding($data) {
	$this->classarray = array_map($this->dash(), $data);
}

// dash function to add a - to both sides of the number of the input array
public function dash($item) {
	$item2 = '-' . $item . '-';
	return $item2;
}

}
// dumps start array
var_dump($array);
//adds line
echo '<br />';
//creates class object
$test = new test();
//classes function adding
$test->adding($array);
// should output the array with values -1-,-2-,-3-,-4-... 
var_dump($test->classarray);

This outputs

array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }

Warning: Missing argument 1 for test::dash(), called in D:\xampp\htdocs\trainingdvd\arraytesting.php on line 11 and defined in D:\xampp\htdocs\trainingdvd\arraytesting.php on line 15

Warning: array_map() expects parameter 1 to be a valid callback, function '--' not found or invalid function name in D:\xampp\htdocs\trainingdvd\arraytesting.php on line 11 NULL

What am I doing wrong or does this function just not work inside classes?

Php Solutions


Solution 1 - Php

You are specifying dash as the callback in the wrong way.

This does not work:

$this->classarray = array_map($this->dash(), $data);

This does:

$this->classarray = array_map(array($this, 'dash'), $data);

Read about the different forms a callback may take here.

Solution 2 - Php

Hello You can use Like this one

    // Static outside of class context
array_map( array( 'ClassName', 'methodName' ), $array );

// Static inside class context
array_map( array( __CLASS__, 'methodName' ), $array );

// Non-static outside of object context
array_map( array( $object, 'methodName' ), $array );

// Non-static inside of object context
array_map( array( $this, 'methodName' ), $array );

Solution 3 - Php

It must read

$this->classarray = array_map(array($this, 'dash'), $data);

The array-thing is the PHP callback for a object instance method. Callbacks to regular functions are defined as simple strings containing the function name ('functionName'), while static method calls are defined as array('ClassName, 'methodName') or as a string like that: 'ClassName::methodName' (this works as of PHP 5.2.3).

Solution 4 - Php

array_map($this->dash(), $data) calls $this->dash() with 0 arguments and uses the return value as the callback function to apply to each member of the array. You want array_map(array($this,'dash'), $data) instead.

Solution 5 - Php

In case the class belongs to a different namespace, you need to use the complete namespaced class name. Below is an example using a CakePHP Utility class:

This will not work:

array_map(array('Inflector', 'humanize'), $some_array));

This will work:

array_map(array('Cake\Utility\Inflector', 'humanize'), $some_array));

Solution 6 - Php

For multidimensional arrays (any arrays):

    $data = array_map('decode'), $data);

    function decode($data)
    {
        if (is_array($data)) {
            foreach ($data as &$value) {
                if (is_array($value)) {
                    $value = decode($value);
                } else {
                    $value = html_entity_decode($value);
                }
            }
        } else {
            $data = html_entity_decode($data);
        }
        return $data;
    }

For multidimensional arrays (any arrays) in Class:

$data = array_map(array($this,'decode'), $data);

private function decode($data)
{
    if (is_array($data)) {
        foreach ($data as &$value) {
            if (is_array($value)) {
                $value = $this->decode($value);
            } else {
                $value = html_entity_decode($value);
            }
        }
    } else {
        $data = html_entity_decode($data);
    }
    return $data;
}

Solution 7 - Php

For those who wonder why array_map doesn't have access to outside variables like me, so variables must be passed using use. For example:

$param = 'some_value';

$ids = array_map(
    function($item) use ($param) { return $item[$param]; },
    $data
);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJustinView Question on Stackoverflow
Solution 1 - PhpJonView Answer on Stackoverflow
Solution 2 - PhpVijaysinh ParmarView Answer on Stackoverflow
Solution 3 - PhpStefan GehrigView Answer on Stackoverflow
Solution 4 - PhpAnomieView Answer on Stackoverflow
Solution 5 - PhpArisView Answer on Stackoverflow
Solution 6 - PhpFormatView Answer on Stackoverflow
Solution 7 - PhpAmir MehrnamView Answer on Stackoverflow