[英]How to create a multi-dimensional array from an indexed array in PHP?
整个代码正常工作只是“datacontractor”字段,这是我的第三个维度不能很好地工作。
<?php
$array=Array
(
"0" => Array
(
"sid" => 10,
"contractorid" => 1,
"fname" => "hi",
"lname" => "fam",
"sname" => "saba",
"materialname" => "beton",
"netweight" => 100,
),
"1" => Array
(
"sid" => 16,
"contractorid" => 2,
"fname" => "a",
"lname" => "a",
"sname" => "khoram",
"materialname" => "kk",
"netweight" => 200,
),
"2" => Array
(
"sid" => 16,
"contractorid" => 7,
"fname" => "a",
"lname" => "a",
"sname" => "khoram",
"materialname" => "kk",
"netweight" => 777,
),
"3" => Array
(
"sid" => 10,
"contractorid" => 5,
"fname" => "hi",
"lname" => "fam",
"sname" => "saba",
"materialname" => "beton",
"netweight" => 200,
),
"4" => Array
(
"sid" => 10,
"contractorid" => 8,
"fname" => "hi",
"lname" => "fam",
"sname" => "saba",
"materialname" => "beton",
"netweight" => 600,
),
"5" => Array
(
"sid" => 15,
"contractorid" => 9,
"fname" => "hi",
"lname" => "fam",
"sname" => "saba",
"materialname" => "beton",
"netweight" => 400,
),
);
$finalarray[]= array();
$sidlist= array();
$arraycount=count($array);
for($i=0;$i<$arraycount ;$i++) {
array_push($sidlist,$array[$i]["sid"]);
}
$sidlist = array_unique($sidlist);
$sidlistcount=count($sidlist);
$sidlist1=array();
foreach ($sidlist as $m){
array_push($sidlist1,$m);
}
for ($i = 0;$i<$sidlistcount ; $i++){
$id=$sidlist1[$i];
$datacontractor[$id]= array();
for ($j = 0;$j<$arraycount ; $j++){
if ($id==$array[$j]["sid"]){
$contractorid = $array[$j]["contractorid"];
$netweight = $array[$j]["netweight"];
$finalarray[$i]=array(
"sid" => $id,
"fname" => $array[$j]["fname"],
"lname" => $array[$j]["lname"],
"sname" => $array[$j]["sname"],
"materialname" => $array[$j]["materialname"],
"datacontractor" => $datacontractor[$id],
);
$datacontractor[$id]["$contractorid"]=$netweight;
echo $id,"<br>";
}
}
}
echo '<pre>';
print_r($finalarray);
echo '<pre>';
Array ([0] => Array
(
[sid] => 10
[fname] => hi
[lname] => fam
[sname] => saba
[materialname] => beton
[datacontractor] => Array
(
[1] => 100
[5] => 200
)
)[1] => Array
(
[sid] => 16
[fname] => a
[lname] => a
[sname] => khoram
[materialname] => kk
[datacontractor] => Array
(
[2] => 200
)
)[2] => Array
(
[sid] => 15
[fname] => hi
[lname] => fam
[sname] => saba
[materialname] => beton
[datacontractor] => Array
(
)
))
请检查并告诉我我的错是什么。
Array ([0] => Array
(
[sid] => 10
[fname] => hi
[lname] => fam
[sname] => saba
[materialname] => beton
[datacontractor] => Array
(
[1] => 100
[5] => 200
[8] => 600
)
)[1] => Array
(
[sid] => 16
[fname] => a
[lname] => a
[sname] => khoram
[materialname] => kk
[datacontractor] => Array
(
[2] => 200
[7] => 777
)
)[2] => Array
(
[sid] => 15
[fname] => hi
[lname] => fam
[sname] => saba
[materialname] => beton
[datacontractor] => Array
(
[9] => 400
)
))
在完成将所有数据插入$datacontractor[$id]
- >之后,将"datacontractor" => $datacontractor[$id]
为finalarray
。
您的代码比实际需要的要复杂得多。
请考虑以下简短版本:
$array = []; // this is just some of the fields - you can add all of then here
$array[] = array("id"=> 10, "contractorid" => 1,"netweight" => 100);
$array[] = array("id"=> 16, "contractorid" => 2,"netweight" => 200);
$array[] = array("id"=> 16, "contractorid" => 7,"netweight" => 777);
$array[] = array("id"=> 10, "contractorid" => 5,"netweight" => 200);
$array[] = array("id"=> 10, "contractorid" => 8,"netweight" => 600);
$array[] = array("id"=> 15, "contractorid" => 9,"netweight" => 400);
$ans = [];
foreach($array as $e) {
if (!isset($ans[$e['id']])) { // if never set do first time
$ans[$e['id']] = array("sid" => $e['id'], "datacontractor" => array($e["contractorid"] => $e["netweight"])); // here you can add all your other fields as fname, lname...
} else {
$ans[$e['id']]["datacontractor"][$e["contractorid"]] = $e["netweight"]; // just add the new field as already set
}
}
现在, $ans
将输出你的愿望
编辑 :
对于多重contractorid
价值变化:
foreach($array as $e) {
if (!isset($ans[$e['id']])) { // if never set do first time
$ans[$e['id']] = array("sid" => $e['id'], "datacontractor" => array($e["contractorid"] => [$e["netweight"]])); // notice "contractorid" has array inside (extra "[]" around $e["netweight"])
} else {
$ans[$e['id']]["datacontractor"][$e["contractorid"]][] = $e["netweight"]; // append to the contractorid array
}
}
对于重新索引$ans
,最后执行此操作: $ans = array_values($ans);
您可以使用array_reduce
$data = array_reduce($array, function ($old, $new) {
if (isset($old[$new['sid']])) {
$new['datacontractor'] = array_merge($old[$new['sid']]['datacontractor'], [$new['netweight']]);
$old[$new['sid']] = $new;
} else {
$new['datacontractor'] = [$new['netweight']];
}
unset($new['netweight']);
$old[$new['sid']] = $new;
return $old;
}, []);
$data = array_values($data);
print '<pre>';
print_r($data);
print '</pre>';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.