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

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

Jashvita 1月前

48 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)
  • 为什么它必须是内置函数? 不,没有,请编写自己的函数。

    与此主题中的其他主题相比,这是一个简单而又好的方法。

    $namearray = array();
    
    foreach ($array as $item) {
        $namearray[] = $item['name'];
    }
    

    在某些情况下,如果键没有命名,你可以这样做

    $namearray = array();
    
    foreach ($array as $key => $value) {
        $namearray [] = $value;
    }
    
  • 好的,考虑到您最近的编辑(“简单的,与其他的相反”),我会咬牙坚持;)如果您按照原始请求将您的代码变成一个真正的函数,它将和下面的array_map()或array_walk()示例一样“复杂”,特别是如果您愿意添加一个执行示例。

  • 嗨,谢谢。我实际上只是问了是否有内置函数 - 我不喜欢重新发明轮子。你给了我答案,你的解决方案基本上就是我会写的。

  • 可以 PHP 5.5 使用 array_column() :

    <?php
    $samples=array(
                array('page' => 'page1', 'name' => 'pagename1'),
                array('page' => 'page2', 'name' => 'pagename2'),
                array('page' => 'page3', 'name' => 'pagename3')
                );
    $names = array_column($samples, 'name');
    print_r($names);
    

    观看实际操作

  • 现在这应该是正确的答案,因为 php 已经添加了内置函数,这正是 OP 所要求的。

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

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

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

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

    以下是一种实用的方法:

    $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);
    
  • 我喜欢这个,而且其中的 lambda 目前与我的大脑非常契合,因为我一直在学习 Scheme。+1

  • 嗯,有。至少对于 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;
        }
    }
    
  • 与 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);
    
  • 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 并且当函数存在时会降级

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

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

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

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

  • 您可以扩展 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
    
  • 我认为没有必要为此内置一个函数。您的那些数组中可能有一个数组。

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

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

  • Hwng 1月前 0 只看Ta
    引用 18

    虽然不是“内置”,但短箭头函数可以简化显式编码(在 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'];
    
  • 使用array_reduce:

    $names = array_reduce($array, function ($carry, $item) {
        return array_merge($carry, [$item['name']]);
    }, []);
    
  • array_reduce 是做什么的?请解释一下,而不是只贴一些没有解释的代码。谢谢

返回
作者最近主题: