【问题标题】:PHP array merge with different type of keysPHP数组与不同类型的键合并
【发布时间】:2018-08-27 20:11:02
【问题描述】:

有没有办法将数组键与唯一名称合并,这样我就可以得到唯一键及其类型和值。我正在使用 yii2 和 mysql

我在 yii2 中使用以下 SQL 查询:

$data= $query->SELECT(["sum(no_of_pages) as pages_coded",'assigned_to','type_of_request','concat(firstname," ",lastname) as userfullname'])
->from('task')
->leftJoin('user','user.username = task.assigned_to')
->andWhere("sdlc_phase='Resolved'")
->orWhere("sdlc_phase='Semi_Resolved'");
$query->groupby(['assigned_to', 'type_of_request']);
//$query->->addGroupBy('assigned_to');
$query->orderby(['assigned_to'=>SORT_ASC]);
$data = $query->all();

SQL 查询的输出是

Array
(
    [0] => Array
        (
            [pages_coded] => 5
            [type_of_request] => Collector Tweak
            [userfullname] => Sam
        )
    [1] => Array
        (
            [pages_coded] => 5
            [type_of_request] => Collector Code
            [userfullname] => John
        )
    [2] => Array
        (
            [pages_coded] => 42
            [type_of_request] => Collector Tweak
            [userfullname] => John
        )
    [3] => Array
        (
            [pages_coded] => 37
            [type_of_request] => Clinical Tweak
            [userfullname] => Dona
        )
    [4] => Array
        (
            [pages_coded] => 35
            [type_of_request] => Collector Code
            [userfullname] => Dona
        )
    [5] => Array
        (
            [pages_coded] => 7
            [type_of_request] => Clinical Code
            [userfullname] => Ricky
        )
    [6] => Array
        (
            [pages_coded] => 50
            [type_of_request] => Clinical Tweak
            [userfullname] => Ricky
        )
    [7] => Array
        (
            [pages_coded] => 4
            [type_of_request] => Collector Code
            [userfullname] => Ricky
        )
    [8] => Array
        (
            [pages_coded] => 17
            [type_of_request] => Collector Tweak
            [userfullname] => Ricky
        )
)

不过我想生成这样的输出,有没有办法得到这个

 Array
(
    [Sam] => Array
        (
            [0] => Clinical Code
            [1] => 0
            [2] => Clinical Tweak
            [3] => 0
            [4] => Collector Code
            [5] => 0
            [6] => Collector Tweak
            [7] => 5
        )
    [John] => Array
        (
            [0] => Clinical Code
            [1] => 0
            [2] => Clinical Tweak
            [3] => 0
            [4] => Collector Code
            [5] => 5
            [6] => Collector Tweak
            [7] => 42
        )
    [Dona] => Array
        (
            [0] => Clinical Code
            [1] => 0
            [2] => Clinical Tweak
            [3] => 37
            [4] => Collector Code
            [5] => 0
            [6] => Collector Tweak
            [7] => 35
        )
   [Ricky] => Array
        (
            [0] => Clinical Code
            [1] => 7
            [2] => Clinical Tweak
            [3] => 50
            [4] => Collector Code
            [5] => 4
            [6] => Collector Tweak
            [7] => 17
        )
)

帮我解决这个问题。

【问题讨论】:

  • 是的 - 您可以使用 foreach 并以您想要的格式构建数组。
  • 来自数据库,不,来自 PHP,是的。但是您用于数组的表示法会以不同的方式更好。
  • 我必须说预期的输出看起来很难使用。为什么不使数组具有关联性并使用(示例)“临床代码”作为具有值的键

标签: php mysql yii yii2


【解决方案1】:

对于您想要的输出,您必须循环创建另一个数组的结果。

$output = array();
foreach ($data as $row) {
    $output[$row['userfullname']][$row['type_of_request']] = $row['pages_coded'];
}

这样你最终会得到如下数组:

$output = array(
    'Sam' => array(
        'Collector Tweak' => 5
    ),
);

因为如果找不到其他列,您显然希望其他列填充为 0:

$categories = array(
    'Clinical Code' => 0,
    'Clinical Tweak' => 0,
    'Collector Code' => 0,
    'Collector Tweak' => 0,
);
foreach ($output as &$outputItem) {
    $outputItem = array_merge($categories, $outputItem);
}

根据定义,这更容易跟踪索引及其各自的值。

在这里测试:https://3v4l.org/0k40Q

【讨论】:

  • 代替第二个循环(嵌套的 foreach),您可能可以使用 array_diff 一些方法来查找缺少的数组项并以这种方式添加它们
  • 不错的主意,让我在某个地方测试一下。 @Andreas,我认为您的想法是正确的,但功能错误。 array_merge() 是最有效的方法。
  • 好一个!我在想arrsy_diff_key。它应该(我认为)也可以工作。任何不具有全部四个的子数组,数组 diff 确实将它们并附加。但我没有测试过
  • array_diff() 会立即显示差异,array_diff_key() 是相同的情况,无论如何它们必须稍后附加到原始数组,但建议使用数组函数无论如何都很棒,谢谢。
  • 嗨@Rafael,$output 数组打印正常,但 $outputItem 只打印一个值,未与 $output 数组合并。下面是输出数组([Clinical Code] => 0 [Clinical Tweak] => 7 [Collector Code] => 0 [Collector Tweak] => 0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多