【问题标题】:Query 2 dimensional array using native php array functions使用原生 php 数组函数查询二维数组
【发布时间】:2015-08-27 10:30:17
【问题描述】:

我已将 CSV 转换为二维数组,其中以下数组结构存储列和行数据

$table['status'] = ['active', 'active', 'inactive'];
$table['plan']   = ['annual', 'weekly', 'weekly  '];
$table['spend']  = ['12,000', '19,000', '0'       ];

print_r($table);

将如下所示:

( [status] => Array ( [0] => active [1] => active [2] => inactive ) 
  [plan] => Array ( [0] => annual [1] => weekly [2] => weekly ) 
  [spend] => Array ( [0] => 12,000 [1] => 19,000 [2] => 0 ) )

我想使用原生 PHP 数组函数来查询数组,而不必编写带有嵌套条件的循环。如果这是一个 MySQL 数据库,并且我想从具有活动状态和每周计划的帐户中查找支出总和,我只需运行以下查询

SELECT SUM('Spend') FROM table WHERE status = 'Active' AND plan = 'Weekly';

但我必须使用 for 循环采取以下方法

for ($index = 1; $index < count($table); $index++){
    if (($table['status'][$index] == 'active') && ($table['plan'][$index] == 'weekly')){
        $spend[$index] = $table['spend'][$index];
    }
}

echo array_sum($spend);

这种方法让我很头疼。是否有一个明显的解决方案可以将其重构为 php 的本机数组函数,或者是否不可避免地会出现大量显式循环?

【问题讨论】:

  • csv 数据是否必须采用该格式?可以将其转换为行列表: $table = array(array(active=>1, 'plan'=>'weekly', 'spend'=>12000), array(.... etc ) 然后使用 array_filter提取你想要的。
  • 我正在考虑这种格式。您能否提供一个具有该数组结构的 array_filter 解决方案的示例?
  • php 中的查询类比是 echo array_sum(array_intersect_key($table['spend'], array_flip(array_intersect(array_keys($table['status'], 'active'), array_keys($table) ['plan'], 'weekly')))); 但是你必须将数字格式转换为19000。或者添加更多功能:)

标签: php sql arrays sorting


【解决方案1】:

没有任何本机功能可以做你想做的事。将 CSV 文件中的信息存储到数据库中有什么问题?

如果这根本不是一个选项,那么试试 foreach 循环,它们会干净得多。

$spend = array();
foreach ($table['spend'] as $key => $amount)
{
    if ($table['status'][$key] == 'active' && $table['plan'][$key] == 'weekly')
    {
        $spend[] = $amount;
    }
}

虽然它不能解决循环问题,但它确实有助于清理它们,这样你就不会那么失去理智。

【讨论】:

    【解决方案2】:

    使用Array Keys 获取所有“活动”键,然后仅循环遍历那些以找到匹配项。

    $keys = array_keys($table['status'], 'active');
    
    foreach($keys as $key)
    {
        if($table['plan'][$key] == 'weekly')
        {
            $spend[] = $table['spend'][$key];
        }
    }
    print_r($spend);
    

    花费: 大批 ( [0] => 19,000 )

    【讨论】:

      【解决方案3】:

      这很混乱,但我找到了一种方法

      $keys = array_intersect(array_keys($table['status'], 'active'), array_keys($table['plan'], 'weekly'));
      $subs['total'] = array_intersect_key($table['spend'], array_flip($keys));
      
      print_r(array_sum($subs['total']));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        相关资源
        最近更新 更多