PHP数组按键展平多维数组
这是我的初始数组:PHP数组按键展平多维数组,php,multidimensional-array,flatten,Php,Multidimensional Array,Flatten,这是我的初始数组: $arr = array( array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'), array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'), array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'), array('model'=>'345',
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
我想谈谈:
$result = array(
array('model'=>'123', 'garment'=>'coat', 'gender'=>'men', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'gender'=>'kids', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'gender'=>'kids', 'brand'=>'', 'title'=>'ccc')
)
请你帮帮我好吗?谢谢。这是我尝试过的解决方案,但在尝试寻找大型阵列的源代码时,内存不足
以下是步骤1:
//---------------------- STEP 1 ------
$result = array();
foreach($arr as $line) {
$result[] = $line['model'];
}
$result = array_values(array_unique($result));
以下是步骤2:
//---------------------- STEP 2 ------
foreach($result as $r) {
$inter = array();
$inter['model'] = $r;
foreach($arr as $line) {
if ($r == $line['model']){
if (!isset($inter['title']) && isset($line['title'])) {
$inter['title'] = $line['title'];
}
if (!isset($inter['garment']) && isset($line['garment'])) {
$inter['garment'] = $line['garment'];
}
if (!isset($inter['gender']) && isset($line['gender'])) {
$inter['gender'] = $line['gender'];
}
if (!isset($inter['brand']) && isset($line['brand'])) {
$inter['brand'] = $line['brand'];
}
}
}
if (!isset($inter['title'])) {
$inter['title'] = '';
}
if (!isset($inter['garment'])) {
$inter['garment'] = '';
}
if (!isset($inter['gender'])) {
$inter['gender'] = '';
}
if (!isset($inter['brand'])) {
$inter['brand'] = '';
}
$results[] = $inter;
unset($inter);
}
unset($result);
return $results;
$arr=array(
数组('model'=>'123','garment'=>'coat','title'=>'aaa'),
数组('model'=>'123','gender'=>'men','title'=>'aaa'),
数组('model'=>'123','brand'=>'adidas','title'=>'aaa'),
数组('model'=>'345','garment'=>'jacket','title'=>'bbb'),
数组('model'=>'345','gender'=>'kids','title'=>'bbb'),
数组('model'=>'345','brand'=>'nike','title'=>'bbb'),
数组('model'=>'678','garment'=>'trainers','title'=>'ccc'),
数组('model'=>'678','gender'=>'kids','title'=>'ccc'),
数组('model'=>'678','brand'=>'','title'=>'ccc')
);
//var_转储($arr);
$arrRes=array();
$arrSort=array();
foreach($arr as$key=>$v){
$key=array_search($v[“model”],$arrSort,true);
如果($key==false){
//键为空,插入模型
$arrRes[]=$v;
$arrSort[]=$v[“模型”];
}
否则{
foreach($v作为$subKey=>$subv){
如果($subKey!=“model”){
$arrRes[$key][$subKey]=$subv;
}
}
}
}
回声“;
var_dump($arrRes);
回声“;
我试过8000行,如果你的循环内存不足,很明显它有逻辑错误
另外,我认为不能在数组中保留相同的字符串键名。我的方法假设输入子数组是3个一批的。
array\u replace()
中的第一个空关联数组用于建立OP所需的键顺序。我使用的是splat运算符
…
,因此需要php5.6+。splat操作符一次交付块中的所有三个子数组 代码:() 输出:
“model”是一种独特的代码吗?使用一个简单的
foreach
loop…yeap。在和中,我有一个唯一值“123”、“345”和“678”的列表,旁边是我使用过的相关参数,但初始数组大约是3000行,我的内存不足-我需要一个更智能的解决方案,这里遇到内存问题肯定要在您的问题中提及。否则你只能得到明显的代码答案,如果有的话(这真的是在家庭作业的难度上)。显示你的代码!但这对“title”不起作用,因为只有最后一个(被覆盖的)值会保留。我的评论的意思是,如果title不同,你不能像这样展平它[123]:title='a',[123]:title='b'。。。只剩下“b”和“a”了。是的,我现在明白了。恐怕我在一行中需要很多,包括标题。但是,嘿,非常感谢你的回答。很有魅力。非常感谢!虽然+error.log显示“信号分段错误(11)”,但我仍然有内存问题。至少它表明这与代码本身无关,而是与内存设置有关。如果你觉得这个答案有帮助,给我一个绿色的勾号表示答案是正确的,谢谢
<?php
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
$new_arr = array();
foreach ($arr AS $tmp) {
$this_model = $tmp['model'];
if (!isset($new_arr[$this_model])) { $new_arr[$this_model] = array(); }
$new_arr[$this_model] = array_merge($new_arr[$this_model], $tmp);
}
print '<pre>';
var_dump($new_arr);
print '</pre>';
?>
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
//var_dump($arr);
$arrRes = array();
$arrSort = array();
foreach($arr as $key => $v){
$key = array_search($v["model"],$arrSort,true);
if($key === false){
//key empty , insert model
$arrRes[] = $v;
$arrSort[] = $v["model"];
}
else{
foreach($v as $subKey => $subv){
if($subKey!="model"){
$arrRes[$key][$subKey] = $subv;
}
}
}
}
echo "<pre>";
var_dump($arrRes);
echo "</pre>";
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
$key_order=['model'=>'','garment'=>'','gender'=>'','brand'=>'','title'=>''];
foreach(array_chunk($arr,3) as $a){
$result[]=array_replace($key_order,...$a);
}
var_export($result);
array (
0 =>
array (
'model' => '123',
'garment' => 'coat',
'gender' => 'men',
'brand' => 'adidas',
'title' => 'aaa',
),
1 =>
array (
'model' => '345',
'garment' => 'jacket',
'gender' => 'kids',
'brand' => 'nike',
'title' => 'bbb',
),
2 =>
array (
'model' => '678',
'garment' => 'trainers',
'gender' => 'kids',
'brand' => '',
'title' => 'ccc',
),
)