在excel中如何得到一维内存数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在excel中如何得到一维内存数组相关的知识,希望对你有一定的参考价值。

如下图的区域,如何通过函数得到横向求和的内存数组
求函数公式

用下面公式就可以了:
=MMULT(A1:E5,1;1;1;1;1)
数组公式,需要按CTRL+SHIFT+回车,完成公式。
参考技术A 就按普通的纵向数组,如B1:B5,前面再加上行列转换函数即可追问

如何写函数公式,求函数公式

参考技术B 按=选定区域 按ALT+= 就可以了追问

你这是对整片区域求和,我要的是通过公式或函数得到横向求和的数组

参考技术C 根据楼上的回答,在F1输入公式
=MMULT($A1:$E$5,1;1;1;1;1)
按CTRL+SHIFT+回车,完成公式。下拉得到每一行之和的数据。
转换为横向的数组:
=TRANSPOSE(MMULT($A1:$E$5,1;1;1;1;1))

如何得到一个一维标量数组作为一个学说dql查询结果?

【中文标题】如何得到一个一维标量数组作为一个学说dql查询结果?【英文标题】:How to get a one-dimensional scalar array as a doctrine dql query result? 【发布时间】:2012-07-24 08:42:46 【问题描述】:

我想从 Auction 表的 id 列中获取一组值。 如果这是一个原始 SQL,我会写:

SELECT id FROM auction

但是当我在 Doctrine 中执行此操作并执行时:

$em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); 

我得到一个这样的数组:

array(
    array('id' => 1),
    array('id' => 2),
)

相反,我想得到一个这样的数组:

array(
    1,
    2
)

我怎样才能使用 Doctrine 做到这一点?

【问题讨论】:

【参考方案1】:

由于 doctrine/orm 2.10.0 有一个内置的解决方案,请参阅https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/reference/dql-doctrine-query-language.html#scalar-column-hydration

use Doctrine\ORM\AbstractQuery;

$query = $em->createQuery("SELECT a.id FROM Auction a");
return $query->getSingleColumnResult();
// Same as:
return $query->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN);

【讨论】:

【参考方案2】:

PHP

您可以使用array_map,并且由于每个数组只有一个项目,因此您可以优雅地使用 'current' 作为回调,而不是写一个closure。

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_map('current', $result);

有关内存使用的更多信息,请参阅Petr Sobotka's answer below。

PHP >= 5.5

作为jcbwlkr's answered below,推荐使用array_column

【讨论】:

getScalarResult() 会给你字符串 - 如果你想要整数,请使用 getArrayResult() 所以! array_column() 在内存管理方面更好还是 foreach 方式,我们应该怎么做?【参考方案3】:

更好的解决方案是使用 PDO:FETCH_COLUMN 。为此,您需要一个定制的保湿器:

//MyProject/Hydrators/ColumnHydrator.php
namespace DoctrineExtensions\Hydrators\Mysql;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator, PDO;

class ColumnHydrator extends AbstractHydrator

    protected function hydrateAllData()
    
        return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
    

将其添加到 Doctrine:

$em->getConfiguration()->addCustomHydrationMode('COLUMN_HYDRATOR', 'MyProject\Hydrators\ColumnHydrator');

你可以这样使用它:

$em->createQuery("SELECT a.id FROM Auction a")->getResult("COLUMN_HYDRATOR");

更多信息: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes

【讨论】:

我已经修改了这个,所以它支持 indexBy gist.github.com/ostrolucky/f9f1e0b271357573fde55b7a2ba91a32【参考方案4】:

从 PHP 5.5 开始,您可以使用array_column 来解决这个问题

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_column($result, "id");

【讨论】:

【参考方案5】:

Ascarius 的回答很优雅,但要注意内存使用! array_map() 创建传递数组的副本并有效地使内存使用量翻倍。如果您使用数十万个数组项,这可能会成为一个问题。由于 PHP 5.4 调用时按引用传递已被删除,所以你不能这样做

// note the ampersand
$ids = array_map('current', &$result);

在这种情况下,你可以选择明显的

$ids = array();
foreach($result as $item) 
  $ids[] = $item['id'];

【讨论】:

这似乎有点违反直觉,因为我们的目标是在这两种情况下“几乎复制”数组。我必须亲自测试它才能确信它是真的:gist.github.com/PowerKiKi/9571aea8fa8d6160955f【参考方案6】:

我认为这在 Doctrine 中是不可能的。 只需使用 PHP 将结果数组转换为您想要的数据结构:

$transform = function($item) 
    return $item['id'];
;
$result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());

【讨论】:

以上是关于在excel中如何得到一维内存数组的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 下标超出一维数组的范围

Excel VBA函数:如何传递范围、转换为数组、反转和返回数组

EXCEL内存数组高分问题,高手来

在excel中过滤数组

Excel 公式学习笔记:数组用法

C#winform怎么导出一维码到EXCEL单元格?