8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

PHP 中是否有一个函数可以从数组中提取“列”?

Jashvita 1月前

68 0

我有一个数组数组,具有以下结构:array(array('page' => 'page1', 'name' => 'pagename1')array('page' => 'page2', 'name' => 'pagename2')array('page'...

我有一个数组数组,具有以下结构:

array(array('page' => 'page1', 'name' => 'pagename1')
      array('page' => 'page2', 'name' => 'pagename2')
      array('page' => 'page3', 'name' => 'pagename3'))

是否有一个内置函数可以返回仅包含“name”键的值的新数组?所以我会得到:

array('pagename1', 'pagename2', 'pagename3')
帖子版权声明 1、本帖标题:PHP 中是否有一个函数可以从数组中提取“列”?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Jashvita在本站《arrays》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 只是为了扩展这里的一些答案,从 PHP 5.5 开始,array_column 就是您想要的。

    它实际上有几种可能的用途。

    使用下面的示例数组,以下是使用 array_column 的不同方法。

    $a = array(
        array('id' => '1', 'name' => 'Joe'),
        array('id' => '2', 'name' => 'Jane')
    );
    

    检索单个列作为数组

    $b = array_column($a, 'name');
    

    会给你。请注意,自动键从 0 开始,就像普通数组一样。

    $b[0] = 'Joe';
    $b[1] = 'Jane';
    

    以列为索引检索完整数组。

    $c = array_column($a, NULL, 'id');
    

    将导致以下结果。

    $c[1] = array('id' => '1', 'name' => 'Joe');
    $c[2] = array('id' => '2', 'name' => 'Jane');
    

    请注意,我选择作为第三个参数的列如何成为每个项目的键,并且我通过将第二个参数设置为 null 来获取完整数组。

    当然,最终的用法是设置第二和第三个参数。

    $d = array_column($a, 'name', 'id');
    

    将为您提供以下内容。

    $d[1] = 'Joe';
    $d[2] = 'Jane';
    

    我个人使用完整的 3 个参数来创建选择选项列表。如果我有一个包含选项的表,我会查询该表并获取结果,然后将其传递给此参数以获取以键为值和标签的列表。这也是构建需要通过索引相交的信息集的绝妙方法。

  • Atle 1月前 0 只看Ta
    引用 3

    考虑此示例输入数组来揭示脚本行为的细微差别:

    $array = [
        'a' => ['page' => 'page1', 'name' => 'pagename1'],
        'b' => ['page' => 'page2', 'name' => 'pagename2'],
        'c' => ['page' => 'page3', 'name' => 'pagename3'],
        'd' => ['page' => 'page4',],
    ];
    
    • 点1

      var_export(array_column($array, 'name'));# array (#   0 => 'pagename1',#   1 => 'pagename2',#   2 => 'pagename3',# )

      点2

    • p3

      var_export(array_map(fn($row) => $row['name'] ?? 'missing', $array));# array (#   'a' => 'pagename1',#   'b' => 'pagename2',#   'c' => 'pagename3',#   'd' => 'missing',# )

      p4

    • p5

      var_export(array_reduce($array, fn($result, $row) => array_merge($result, [$row['name'] ?? 'missing']), []));# array (#   0 => 'pagename1',#   1 => 'pagename2',#   2 => 'pagename3',#   3 => 'missing',# )

      p6

    • p7

      array_walk($array, fn(&$row) => $row = $row['name'] ?? 'missing');var_export($array);# array (#   'a' => 'pagename1',#   'b' => 'pagename2',#   'c' => 'pagename3',#   'd' => 'missing',# )

      p8

    • p9

      $result = [];foreach ($array as ['name' => $result[]]);var_export($result);

      p10

      p11

      $result = [];foreach ($array as $row) {    $result[] = $row['name'] ?? 'missing';}var_export($result);

      p12

      foreach ($array as &$row) {    $row = $row['name'] ?? 'missing';}var_export($array);
    • p13

      $colName = 'name';$result = [];array_walk_recursive(    $array,    function ($v, $k) use ($colName, &$result) {        if ($k === $colName) {            $result[] = $v;        }    });var_export($result);
  • 您还可以获取列,绑定键值:

    $a = array(
              array(
                'id' => 5698,
                'first_name' => 'Peter',
                'last_name' => 'Griffin',
              ),
              array(
                'id' => 4767,
                'first_name' => 'Ben',
                'last_name' => 'Smith',
              ),
              array(
                'id' => 3809,
                'first_name' => 'Joe',
                'last_name' => 'Doe',
              )
            );
    

    如果你只想要列然后使用:

    $last_names = array_column($a, 'last_name');
    print_r($last_names);
            
    

    如果您想绑定键和值,那么使用:

    $last_names = array_column($a, 'last_name', 'id');
    print_r($last_names);
        
    
  • @Progrock 我看到这篇帖子在首页上,于是查看了“今日活跃”的内容,发现这个答案被突出显示了。我忽略了答案的日期,并认为这是来自用户的新答案。

  • @Martin 同意可以进行一些编辑,但由于 Tony 自 2016 年以来就没有露面,责任就落在了别人身上。大多数提交的内容都可以改进。尤其是当其他问题重定向到这里时。

  • array_reduce 是做什么的?请解释一下,而不是只贴一些没有解释的代码。谢谢

  • 使用array_reduce:

    $names = array_reduce($array, function ($carry, $item) {
        return array_merge($carry, [$item['name']]);
    }, []);
    
  • Hwng 1月前 0 只看Ta
    引用 9

    虽然不是“内置”,但短箭头函数可以简化显式编码(在 Php v7.4 中引入),并且可以与 array_map 一起使用进行数组转换。

    这里对数组的每个成员应用一个回调,从每个子数组返回所需的属性:

    <?php
    $data =
    [
        ['page' => 'page1', 'name' => 'pagename1'],
        ['page' => 'page2', 'name' => 'pagename2'],
        ['page' => 'page3', 'name' => 'pagename3']
    ];
    
    $names = array_map(fn($v) => $v['name'], $data);
    var_export($names);
    

    输出:

    array (
        0 => 'pagename1',
        1 => 'pagename2',
        2 => 'pagename3',
      )
    

    OP 在 array_column 存在之前就发布了这个问题(从 Php 5.5.0 开始)。这用一个简短的解决方案回答了原始问题:

    $names = array_column($data, 'name');
    

    但是一个简单的循环也太陈旧了:

    foreach($data as $item) $names[] = $item['name'];
    
  • 我认为没有必要为此内置一个函数。您的那些数组中可能有一个数组。

    $samples=array(
                array('page' => 'page1', 'name' => 'pagename1'),
                array('page' => 'page2', 'name' => 'pagename2'),
                array('page' => 'page3', 'name' => 'pagename3')
                );
    
    $output1=array();
    $output2=array();
    foreach($samples as $sample){
        array_push($output1,$sample['name']);
        $output2[]=array_splice($sample,1);
    
    }
    
    print_r($output1);
    print_r($output2);
    

    如果您只想删除“页面”索引部分,那么 $output1 中的输出就是您想要的,然后是 $output2。

    如果你需要该数组中的所有值并按数字方式索引该数组,那么你可以使用

    $array_1=array_values($samples); 
    

    但据我所知,你不想要这个。

  • 您可以扩展 ArrayIterator 类 并重写方法 mixed current(void) .

    class Foo extends ArrayIterator {
      protected $index;
      public function __construct($array, $index) {
        parent::__construct($array);
        $this->index = $index;
      }
    
      public function current() {
        $c = parent::current();
        return isset($c[$this->index]) ? $c[$this->index] : null;
      }
    }
    
    $a = array(
      array('page' => 'page1', 'name' => 'pagename1'),
      array('name' => '---'),
      array('page' => 'page2', 'name' => 'pagename2'),
      array('page' => 'page3', 'name' => 'pagename3')
    );
    
    $f = new Foo($a, 'page');
    foreach($f as $e) {
      echo $e, "\n";
    }
    

    印刷

    page1
    
    page2
    page3
    
  • 是的,有一个名为 array_column 的 php 内置函数可以完成您要查找的操作。

    您可以将其称为类似于 $name_keys = array_column($array, 'name'); 获得所寻找的结果。

    有关详细信息,请参阅 PHP 手册中的以下条目:

    http://php.net/manual/en/function.array-column.php

  • if (!function_exists('array_column')) {
        function array_column($array,$column) {
        $col = array();
        foreach ($array as $k => $v) {
            $col[]=$v[$column];
        }
        return $col;
        }
    }
    

    这应该适用于 php 版本 < 5.5 并且当函数存在时会降级

  • 与 fuentesjrs 解决方案类似,但使用带有自定义回调的 array_walk() 更加通用:

    // Define the callback
    function extract_named_sub_elements(&$item, $key, $name) {
      $item = $item[$name];
    }
    
    // Test data
    $original = array(
      array('page' => 'page1', 'name' => 'pagename1'),
      array('page' => 'page2', 'name' => 'pagename2'),
      array('page' => 'page3', 'name' => 'pagename3'),
    );
    
    // Use a copy, as array_walk() operates directly on the passed in array
    $copy = $original;
    
    // Substitute 'name' with whatever element you want to extract, e.g. 'page'
    array_walk($copy, 'extract_named_sub_elements', 'name');
    
    print_r($copy);
    
  • 嗯,有。至少对于 PHP > 5.5.0 来说,它被称为 array_column

    PHP 函数采用一个可选 $index_key 参数,根据 PHP 网站所述,该参数指出:

    $index_key

    用作返回数组的索引/键的列。此值可能是列的整数键,也可能是字符串键名称

    在这里的答案中,我看到了一个没有可选参数的精简版本。我需要它,所以这里是完整的函数:

    if (!function_exists('array_column')) {
        function array_column($array, $column, $index_key = null) {
            $toret = array();
            foreach ($array as $key => $value) {
                if ($index_key === null){
                    $toret[] = $value[$column];
                }else{
                    $toret[$value[$index_key]] = $value[$column];
                }
            }
            return $toret;
        }
    }
    
  • 我喜欢这个,而且其中的 lambda 目前与我的大脑非常契合,因为我一直在学习 Scheme。+1

  • dect 1月前 0 只看Ta
    引用 17

    以下是一种实用的方法:

    $data = array(
                array('page' => 'page1', 'name' => 'pagename1'),
                array('page' => 'page2', 'name' => 'pagename2'),
                array('page' => 'page3', 'name' => 'pagename3'));
    
    $result = array_map(create_function('$arr', 'return $arr["name"];'), $data);
    print_r($result);
    
  • 引用 18

    @John,完全没问题,我不确定你是否可以向工作人员报告这个问题以采取预防措施。不过,我已将所有内容标记为正常,因为我相信其他人也会这样做 :)

  • @Option 谢谢你的提醒。如果他们标记这样的内容,我认为不会有什么结果。但他们在浪费人们的时间,真可惜。

  • @John Conde,今天一定有人对你怀恨在心,因为你的很多帖子都被标记为低质量……

返回
作者最近主题: