【问题标题】:Array_map function in php with parameter带参数的php中的Array_map函数
【发布时间】:2012-01-05 15:56:23
【问题描述】:

我有这个

$ids = array_map(array($this, 'myarraymap'), $data['student_teacher']);

function myarraymap($item) {
    return $item['user_id'];
}

我想在我的函数中添加一个其他参数来获得类似的东西

function myarraymap($item,$item2) {
    return $item['$item2'];
}

有人可以帮助我吗?我尝试了很多东西,但没有任何效果

【问题讨论】:

  • 您希望$item2 成为什么?一个常数值?
  • 我认为您对array_map 的调用存在缺陷。你能举个合适的例子吗?
  • array_map :回调函数接受的参数数量应与传递给 array_map() 的数组数量相匹配 技巧:您可以使用数组作为参数持有者,例如数组array_map ( callable $callback, array_to_map,array('param') )

标签: php arrays


【解决方案1】:

您可以使用 anonymous function 并将局部变量的值传输到您的 myarraymap 第二个参数中:

function myarraymap($item,$item2) {
    return $item[$item2];
}

$param = 'some_value';

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

通常只在匿名函数体内传递值就足够了:

function($item) { return myarraymap($item, 'some_value'); }

从 PHP 7.4 开始,您可以使用arrow functions(基本上是语法更简洁的简短匿名函数)来获得更简洁的代码:

$ids = array_map(
    fn($item) => myarraymap($item, $param),
    $data['student_teacher']
);

【讨论】:

    【解决方案2】:

    PHP 的array_map() 支持第三个参数,它是一个数组,表示要传递给回调函数的参数。例如,从所有数组元素中修剪 / 字符可以这样完成:

    $to_trim = array('/some/','/link');
    $trimmed = array_map('trim',$to_trim,array_fill(0,count($to_trim),'/'));
    

    比使用自定义函数或array_walk()等其他函数要容易得多。

    注意正如在下面的 cmets 中指出的那样,我有点仓促,第三个参数确实需要与第二个参数的长度相同,这是通过 array_fill() 完成的。

    以上输出:

    array(2) {
      [0]=>
      string(4) "some"
      [1]=>
      string(4) "link"
    }
    

    【讨论】:

    • 它似乎不像你描述的那样工作。测试一下。第三个参数需要是一个元素数组 - 这些元素中的每一个都作为参数与被修剪数组中的匹配元素一起传递:$trimmed = array_map('trim',array('/some/','/link'),array('/', '/'));
    • @cascaval 在注意到同样的问题后我自己更正了,但忘了回来发布更新。感谢您的提醒,请查看更新后的答案,如果有用,请重新投票;)
    • 什么是“NB”什么意思?
    • @elbowlobstercowstand "nota bene" 或记下/记好...这是拉丁文en.m.wikipedia.org/wiki/Nota_bene
    • 谢谢!!!我一直在毫无结果地寻找这段代码。我在一个需要删除的元素的末尾有一个尾随字符。
    【解决方案3】:

    考虑使用array_map 函数的第三个参数将附加参数传递给callable 函数。示例:

    <?php
    
    function myFunc($item, $param) {
        echo $param . PHP_EOL;
    }
    
    $array = ['foo', 'bar'];
    
    array_map('myFunc', $array, ['the foo param', 'the bar param']);
    
    // the foo param
    // the bar param
    

    参考:https://www.php.net/manual/en/function.array-map.php

    文档提到了来自array_map 函数的第三个参数:“通过回调函数运行的数组参数的补充变量列表。”

    【讨论】:

    • 也许可以测试您发布的代码?输出将是“foo”,然后是“bar”。如果您向myFunc 添加了第二个参数,则它将仅针对$array 的第一个元素传递'the param'。对于后续元素,它将传递null,因为“如果数组长度不等,较短的数组将用空元素扩展以匹配最长的长度。”
    • 感谢您指出错误。我刚刚更新了我的答案。
    【解决方案4】:

    除了创建映射器对象之外,您无能为力。例如:

    class customMapper {
        private $customMap = NULL;
        public function __construct($customMap){
            $this->customMap = $customMap;
        }
        public function map($data){
            return $data[$this->customMap];
        }
    }
    

    然后在你的函数内部,而不是创建你自己的映射器,使用新的类:

    $ids = array_map(array(new customMapper('param2'), 'map'), $data['student_teacher']);
    

    这将允许您创建一个自定义映射器,该映射器可以返回任何类型的信息...并且您可以复杂化您的 customMapper 以轻松接受更多字段或配置。

    【讨论】:

      【解决方案5】:

      考虑使用array_walk。它允许你通过user_data

      【讨论】:

      • 但是如果有多个参数,我们如何传递参数呢?
      猜你喜欢
      • 1970-01-01
      • 2017-05-08
      • 2011-07-27
      • 2015-04-26
      • 2017-01-28
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多