【发布时间】:2019-10-30 10:03:04
【问题描述】:
我有一个这样的数组数组,我从服务器的响应中得到:
$data = array (
'data1' => array (
0 =>
array (
0 => 'ID',
1 => 'PinCode',
2 => 'Date',
),
1 =>
array (
0 => '101',
1 => '454075',
2 => '2012-03-03',
),
2 =>
array (
0 => '103',
1 => '786075',
2 => '2012-09-05',
),
),
'data2' => array (
0 =>
array (
0 => 'Balance',
1 => 'ID',
),
1 =>
array (
0 => '4533',
1 => '101',
)
),
'data3' => array (
0 =>
array (
0 => 'Active',
1 => 'ID',
),
1 =>
array (
0 => 'Yes',
1 => '101',
),
2 =>
array (
0 => 'No',
1 => '103',
),
),
);
在上面的数组上,我执行了一种左连接操作以获得下面的最终输出:
Array
(
[0] => Array
(
[ID] => 101
[PinCode] => 454075
[Date] => 2012-03-03
[Balance] => 4533
[Active] => Yes
)
[1] => Array
(
[ID] => 103
[PinCode] => 786075
[Date] => 2012-09-05
[Balance] => 0
[Active] => No
)
)
我将解释如何获得输出。
在所有数组data1、data2 和data3 中,第一行是列的名称,其余行包含这些列的数据。
首先我取$data数组中长度最大的数组。因此从$data 我首先选择data1 数组,因为它的长度是3。
使用以下代码:
$data1=$data['data1'];
$columns_data1 = $data1[0];
for($i=1;$i<=(count($data1)-1);$i++)
{
$output_data1[] = array_combine($columns_data1,$data1[$i]);
}
echo print_r($output_data1);
我得到这样的输出$output_data1:
Array
(
[0] => Array
(
[ID] => 101
[PinCode] => 454075
[Date] => 2012-03-03
)
[1] => Array
(
[ID] => 103
[PinCode] => 786075
[Date] => 2012-09-05
)
)
在此之后,我对data2 和data3 数组执行以下操作,以使其长度等于data1 length - 1 的长度,即不包括包含列名的第一行。
$data2=$data['data2'];
$columns_data2 = $data2[0];
for($i=1;$i<=(count($data1)-1);$i++)
{
if($i<count($data2))
$output_data2[] = array_combine($columns_data2,$data2[$i]);
else
$output_data2[]=array_combine($columns_data2,array('0'=>'0','1'=>'0')); //add the value as 0 to the rows and make the length equal to that of data1. Here I've take index 0 and 1 because first row in data contains two index i.e Balance and ID.
}
echo print_r($output_data2);
此代码为data2 提供以下输出:
Array
(
[0] => Array
(
[Balance] => 4533
[ID] => 101
)
[1] => Array
(
[Balance] => 0
[ID] => 0
)
)
data3 类似:
$data3=$data['data3'];
$columns_data3 = $data3[0];
for($i=1;$i<=(count($data1)-1);$i++)
{
if($i<count($data3))
$output_data3[] = array_combine($columns_data3,$data3[$i]);
else
$output_data3[]=array_combine($columns_data3,array('0'=>'0','1'=>'0'));
}
echo "<pre>"; print_r($output_data3);
给出输出:
Array
(
[0] => Array
(
[Active] => Yes
[ID] => 101
)
[1] => Array
(
[Active] => No
[ID] => 103
)
)
接下来我将合并$output_data1 和$output_data2:
$left_join_on = array_column($output_data2, "ID");
$first_leftjoin_output = array();
foreach($output_data1 as $values){
$key = array_search($values['ID'], $left_join_on);
if($key ===false){
$key = array_search(0, $left_join_on);
}
unset($output_data2[$key]['ID']);
$first_leftjoin_output[] = array_merge($values,$output_data2[$key]);
}
echo "<pre>"; print_r($first_leftjoin_output);
给出输出:
Array
(
[0] => Array
(
[ID] => 101
[PinCode] => 454075
[Date] => 2012-03-03
[Balance] => 4533
)
[1] => Array
(
[ID] => 103
[PinCode] => 786075
[Date] => 2012-09-05
[Balance] => 0 //added 0 to balance as ID 103 didn't existed in output_data2. just like a left join of sql
)
)
接下来我将加入 $first_leftjoin_output 和 $output_data3
$left_join_on_next = array_column($output_data3, "ID");
$second_leftjoin_output = array();
foreach($first_leftjoin_output as $values){
$key = array_search($values['ID'], $left_join_on_next);
if($key ===false){
$key = array_search(0, $left_join_on_next);
}
unset($output_data3[$key]['ID']);
$second_leftjoin_output[] = array_merge($values,$output_data3[$key]);
}
echo "<pre>"; print_r($second_leftjoin_output);
这一步给出了我在问题开头已经提到的最终输出$second_leftjoin_output。
Array
(
[0] => Array
(
[ID] => 101
[PinCode] => 454075
[Date] => 2012-03-03
[Balance] => 4533
[Active] => Yes
)
[1] => Array
(
[ID] => 103
[PinCode] => 786075
[Date] => 2012-09-05
[Balance] => 0
[Active] => No
)
)
因此,我通过这种方式加入了基于匹配ID 字段的所有三个数组。
如您所见,我正在以硬编码的方式完成所有这些工作。
如果我的$data array 包含data4,那么我将再次添加代码以获取$third_leftjoin_output。
我希望这个过程是动态的。
我想要一个动态解决方案,这样我只需传递 $data 数组和左连接所基于的字段的名称。
类似这样的:
$output = left_join_function($data,"ID");
并且这个函数应该返回提到的输出。或者任何其他更好的解决方案也会非常有帮助。
我无法弄清楚如何以一种简洁的方式完成此操作。
对此的任何建议都会非常有帮助。 我该怎么做?
【问题讨论】:
-
似乎真正需要更改的唯一值是您帐户的
ID。你为什么不这样做:array_column($output_data3, $2nd_param);和array_search($values[$2nd_param], $left_join_on_next);.etc。其中$2nd_param是ID? -
我建议您使用我在stackoverflow.com/a/56559802/6487675 的解决方案,这样,添加第 3 个或第 4 个数组很容易
标签: php arrays codeigniter sorting optimization