PHP检查数组是否包含所有位置
我有一个数组: 例: 我有这个阵列:PHP检查数组是否包含所有位置,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个数组: 例: 我有这个阵列: array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600"); 我需要检查每个“名称”是否包含最后一个数组的所有大小,如果不存在,我需要添加。 预期的结果是“name”AAA将重复11次,对于“name CC”“DD”等一个数组,重复11次,最后一个数组的所有大小都相同 我
array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
我需要检查每个“名称”是否包含最后一个数组的所有大小,如果不存在,我需要添加。
预期的结果是“name”AAA将重复11次,对于“name CC”“DD”等一个数组,重复11次,最后一个数组的所有大小都相同
我试着为每个人做2个比较,但无法与'name'AA和其他人区分开来
我还有场数。因此,我需要保留初始“计数”,每次添加缺少的位置时,我需要使新位置的“计数”值=0
有人能帮我检查一下吗?
我的实际代码
$tmp22222=array();
foreach ($result as &$v){
foreach ($sizes as $s) {
if($v['size']==$s) {
array_push($tmp22222, $v);
break;
}
if(!in_array($tmp22222, $v['size'])){
$v['size'] = $s;
$v['count'] = 0;
array_push($tmp22222, $v);
}
}
}
var_dump($tmp22222);
预期结果:
array(
array([name]=>AAA
[size]=>300x250
[count]=>10
)
array([name]=>AAA
[size]=>160x600
[count]=>9
)
array([name]=>AAA
[size]=>728x90
[count]=>3
)
array([name]=>AAA
[size]=>300x600
[count]=>0
)
array([name]=>AAA
[size]=>300x300
[count]=>0
)
array([name]=>AAA
[size]=>120x600
[count]=>0
)
array([name]=>AAA
[size]=>100x72
[count]=>0
)
array([name]=>AAA
[size]=>970x250
[count]=>0
)
array([name]=>AAA
[size]=>750x200
[count]=>0
)
array([name]=>AAA
[size]=>120x60
[count]=>0
)
array([name]=>AAA
[size]=>200x600
[count]=>0
)
array([name]=>CC
[size]=>300x250
[count]=>66
)
array([name]=>CC
[size]=>160x600
[count]=>55
)
array([name]=>CC
[size]=>728x90
[count]=>100
)
array([name]=>CC
[size]=>300x600
[count]=>0
)
array([name]=>CC
[size]=>300x300
[count]=>0
)
array([name]=>CC
[size]=>120x600
[count]=>0
)
array([name]=>CC
[size]=>100x72
[count]=>0
)
array([name]=>CC
[size]=>970x250
[count]=>0
)
array([name]=>CC
[size]=>750x200
[count]=>0
)
array([name]=>CC
[size]=>120x60
[count]=>0
)
array([name]=>CC
[size]=>200x600
[count]=>0
)
已添加“计数”=0的所有位置
如您所见,第一个数组上的现有大小和计数继续使用相同的值,只需添加计数为0的新大小即可尝试以下简单解决方案:
$array = array(
array('name' => 'AAA',
'size' => '300x250',
'count' => '10',
),
array('name' => 'AAA',
'size' => '160x600',
'count' => '9',
),
array('name' => 'AAA',
'size' => '728x90',
'count' => '7',
),
array('name' => 'CC',
'size' => '300x250',
'count' => '5',
),
array('name' => 'CC',
'size' => '160x600',
'count' => '7',
),
array('name' => 'DD',
'size' => '728x90',
'count' => '1',
)
);
$size_array = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
//get unique name from original array
$names = array_unique(array_column($array, 'name'));
/**
* for php < 5.5 change above line to
*
$names = array_map(function($element) {
return $element['name'];
}, $array);
$names = array_unique($names);
*/
foreach($names as $name){
$size_exists_array = array_filter($array, function($val) use($name){
if($val['name'] == $name){
return true;
} else {
return false;
}
});
//get already exists size
$size = array_unique(array_column($size_exists_array, 'size'));
/**
* for php < 5.5 change above line to
*
$size = array_map(function($element) {
return $element['size'];
}, $size_exists_array);
$size = array_unique($size);
*/
//calculate difference of exist and available size
$diff = array_diff($size_array, $size);
//insert non exists size for name
if($diff){
foreach($diff as $dif){
$array[] = array('name' => $name, 'size' => $dif, 'count' => '0',);
}
}
}
sort($array);
print_r($array);
尝试以下简单的解决方案:
$array = array(
array('name' => 'AAA',
'size' => '300x250',
'count' => '10',
),
array('name' => 'AAA',
'size' => '160x600',
'count' => '9',
),
array('name' => 'AAA',
'size' => '728x90',
'count' => '7',
),
array('name' => 'CC',
'size' => '300x250',
'count' => '5',
),
array('name' => 'CC',
'size' => '160x600',
'count' => '7',
),
array('name' => 'DD',
'size' => '728x90',
'count' => '1',
)
);
$size_array = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
//get unique name from original array
$names = array_unique(array_column($array, 'name'));
/**
* for php < 5.5 change above line to
*
$names = array_map(function($element) {
return $element['name'];
}, $array);
$names = array_unique($names);
*/
foreach($names as $name){
$size_exists_array = array_filter($array, function($val) use($name){
if($val['name'] == $name){
return true;
} else {
return false;
}
});
//get already exists size
$size = array_unique(array_column($size_exists_array, 'size'));
/**
* for php < 5.5 change above line to
*
$size = array_map(function($element) {
return $element['size'];
}, $size_exists_array);
$size = array_unique($size);
*/
//calculate difference of exist and available size
$diff = array_diff($size_array, $size);
//insert non exists size for name
if($diff){
foreach($diff as $dif){
$array[] = array('name' => $name, 'size' => $dif, 'count' => '0',);
}
}
}
sort($array);
print_r($array);
如果更改数组格式,则会变得更简单:
// reformat array into ['AAA' => ['300x250' => 10, ..]]
$grouped = array_reduce($result, function (array $grouped, array $item) {
$grouped[$item['name']][$item['size']] = $item['count'];
return $grouped;
}, array());
// create default size => 0 mapping
$defaultSizes = array_fill_keys($sizes, 0);
// add default size => 0 map to each name group, doesn't overwrite existing values
$grouped = array_map(function (array $group) use ($defaultSizes) {
return $group + $defaultSizes;
}, $grouped);
// reformat into original structure
$result = array_reduce(array_keys($grouped), function (array $result, array $name) use ($grouped) {
foreach ($grouped[$name] as $size => $count) {
$result[] = compact('name', 'size', 'count');
}
return $result;
}, array());
如果更改数组格式,则会变得更简单:
// reformat array into ['AAA' => ['300x250' => 10, ..]]
$grouped = array_reduce($result, function (array $grouped, array $item) {
$grouped[$item['name']][$item['size']] = $item['count'];
return $grouped;
}, array());
// create default size => 0 mapping
$defaultSizes = array_fill_keys($sizes, 0);
// add default size => 0 map to each name group, doesn't overwrite existing values
$grouped = array_map(function (array $group) use ($defaultSizes) {
return $group + $defaultSizes;
}, $grouped);
// reformat into original structure
$result = array_reduce(array_keys($grouped), function (array $result, array $name) use ($grouped) {
foreach ($grouped[$name] as $size => $count) {
$result[] = compact('name', 'size', 'count');
}
return $result;
}, array());
这不是一种有效的方法,但它有很多组合
$sizes = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
$ex = array(
array("name"=>"AAA",
"size"=>"300x250",
"count"=>10
),
array("name"=>"AAA",
"size"=>"160x600",
"count"=>9
),
array("name"=>"AAA",
"size"=>"728x90",
"count"=>3
),
array("name"=>"CC",
"size"=>"300x250",
"count"=>66
),
array("name"=>"CC",
"size"=>"160x600",
"count"=>55
),
array("name"=>"DD",
"size"=>"728x90",
"count"=>100
)
);
$reorderedEx = array();
foreach($ex as $item){
$reorderedEx[$item["name"]][$item["size"]] = $item["count"];
}
foreach($sizes as $size){
foreach($reorderedEx as $name=>$r){
if(empty($reorderedEx[$name][$size])){
$reorderedEx[$name][$size] = "0";
}
}
}
$reconstruct = array();
foreach($reorderedEx as $name => $val){
foreach($val as $size => $count){
$reconstruct[] = array("name" => $name,"size"=>$size,"count"=>$count);
}
}
echo "<pre>",print_r($reconstruct,true);
这不是一种有效的方法,但它有很多组合
$sizes = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
$ex = array(
array("name"=>"AAA",
"size"=>"300x250",
"count"=>10
),
array("name"=>"AAA",
"size"=>"160x600",
"count"=>9
),
array("name"=>"AAA",
"size"=>"728x90",
"count"=>3
),
array("name"=>"CC",
"size"=>"300x250",
"count"=>66
),
array("name"=>"CC",
"size"=>"160x600",
"count"=>55
),
array("name"=>"DD",
"size"=>"728x90",
"count"=>100
)
);
$reorderedEx = array();
foreach($ex as $item){
$reorderedEx[$item["name"]][$item["size"]] = $item["count"];
}
foreach($sizes as $size){
foreach($reorderedEx as $name=>$r){
if(empty($reorderedEx[$name][$size])){
$reorderedEx[$name][$size] = "0";
}
}
}
$reconstruct = array();
foreach($reorderedEx as $name => $val){
foreach($val as $size => $count){
$reconstruct[] = array("name" => $name,"size"=>$size,"count"=>$count);
}
}
echo "<pre>",print_r($reconstruct,true);
向我们展示你的代码:嗨@HalayemAnis,我添加了我的代码,谢谢如果我不存在,我需要添加-添加什么?对不起。AA从另一个阵列中只有3个大小。我必须添加缺失尺寸和计数为0的AA,AAA、CC等是否已修复?或者,您需要查看第一个数组来找出需要担心的名称吗?换句话说,结果是否总是包含AAA、CC和DD,或者是否会有更多的名称,或者不同的名称,或者可能不是全部三个?向我们展示您的代码:hi@HalayemAnis我添加了我的代码,thanksif不存在我需要添加-添加什么?抱歉。AA从另一个阵列中只有3个大小。我必须添加缺失尺寸和计数为0的AA,AAA、CC等是否已修复?或者,您需要查看第一个数组来找出需要担心的名称吗?换句话说,结果是否总是包含AAA、CC和DD,或者是否会有更多的名称,或者不同的名称,或者可能不是全部三个?我不知道为什么,$val['name']==$name是空的,所以不会显示任何内容您使用的php版本是PHP5.6,我使用了var_转储$val['code'];并检查它是否没有得到任何返回数组的内容,该数组包含原始数组中特定名称的所有大小。。只需使用print_r$size_existing_arrayi不知道为什么,$val['name']=$name是空的,所以不显示任何内容您使用的php版本是PHP5.6,我使用了var_dump$val['code'];并检查它是否没有得到任何返回数组的内容,该数组包含原始数组中特定名称的所有大小。。只需使用print_r$size_existing_array在第一个函数中为我提供了一个意外的“[”。这里:$grouped[$result['name'][$result['size']]=$result['count'];return$grouped;},[];您可能正在运行一个非常旧的PHP版本吗?[]只是[]本身,而不是$grouped[]是PHP 5.4+中数组的简写符号。如果您使用的是旧的:1升级,2将[]数组文字替换为旧数组。因此,将两个数组的最后一个参数[]替换为array,它应该可以工作。在第一个函数中,is给了我一个意外的“[”。这里:$grouped[$result['name'][$result['size']=$result['count'];return$grouped;},[];您可能正在运行一个非常旧的PHP版本吗?[]只是[]本身,而不是$grouped[]是PHP5.4+中数组的简写符号。如果您使用的是较旧的符号:1升级,2用旧数组替换[]数组文本。因此,替换最后一个参数[]对于这两个数组,使用数组减少,它应该可以工作。