我正在创建一个网站,并且正在尝试对数组进行一些复杂的操作以使其正常工作。
这是一个电子商务网站,我网站上的每个产品都可以具有许多属性。我正在尝试获取属性的每种组合以分别为它们定价。
首先,我得到一个具有属性ID($attribute_id_array
)的数组,并在数据库中查询该数组的选项。
因此,如果一个属性是颜色,则此处的选项将是红色,绿色,蓝色等。或大小将是小,中,大等。然后将它们存储在新数组($attribute_arrays
)中。
然后我遍历所有这些,以获得产品可以拥有的每种属性组合,然后将它们再次分类到一个新的数组中($new_attributes_array
)。
然后我循环浏览并为每种组合创建价格表。
$attribute_arrays = [];
foreach($attribute_id_array as $attribute_id){
$params = [$attribute_id];
$sql = "SELECT * FROM attributes WHERE id=?";
$attributeResult = DB::run($sql,$params);
while($row = $attributeResult->fetch(PDO::FETCH_ASSOC)){
array_push($attribute_arrays,$row);
}
}
var_dump($attribute_arrays);
function combinations($arrays, $i = 0) {
if (!isset($arrays[$i])) {
return array();
}
if ($i == count($arrays) - 1) {
return $arrays[$i];
}
$tmp = combinations($arrays, $i + 1);
$result = array();
foreach ($arrays[$i] as $v) {
foreach ($tmp as $t) {
$result[] = is_array($t) ?
array_merge(array($v), $t) :
array($v, $t);
}
}
return $result;
}
$new_attributes_array = combinations($attribute_arrays);
var_dump($new_attributes_array);
一切正常,只是我希望能够获取所有键值对的键,以便可以将其引用回数据库。
此刻出来的方式是这样的:
$ attribute_id_array:
array (size=2)
1 => string '5' (length=1)
2 => string '7' (length=1)
$ attribute_arrays:
0 =>
array (size=2)
'attribute1' => string 'Step Through Bars' (length=17)
'attribute2' => string 'Gated' (length=5)
1 =>
array (size=2)
'attribute1' => string '3 metres' (length=8)
'attribute2' => string '6 metres' (length=8)
$ new_attributes_array:
0 =>
array (size=2)
0 => string 'Step Through Bars' (length=17)
1 => string '3 metres' (length=8)
1 =>
array (size=2)
0 => string 'Step Through Bars' (length=17)
1 => string '6 metres' (length=8)
2 =>
array (size=2)
0 => string 'Gated' (length=5)
1 => string '3 metres' (length=8)
3 =>
array (size=2)
0 => string 'Gated' (length=5)
1 => string '6 metres' (length=8)
有没有一种方法可以使密钥的格式类似于:
0 =>
array (size=2)
5-attribute1 => string 'Step Through Bars' (length=17)
7-attribute1 => string '3 metres' (length=8)
1 =>
array (size=2)
5-attribute1 => string 'Step Through Bars' (length=17)
7-attribute2 => string '6 metres' (length=8)
对此将提供任何帮助或帮助。
/ ----------编辑--------- \
因此,我将array_push($attribute_arrays,$row);
行更改为$attribute_arrays[$attribute_id] = $row;
。
这现在意味着$attribute_arrays
现在具有$attribute_id
变量作为键,如下所示:
array (size=2)
5 =>
array (size=2)
'attribute1' => string 'Step Through Bars' (length=17)
'attribute2' => string 'Gated' (length=5)
7 =>
array (size=2)
'attribute1' => string '3 metres' (length=8)
'attribute2' => string '6 metres' (length=8)
这现在意味着我获取组合的其他函数将不起作用,因为它使用$i
变量作为从'0'开始的数组的索引。
在线找到了另一个功能,可以在此处How to generate in PHP all combinations of items in multiple arrays对其进行排序:
function combinations($arrays) {
$result = array(array());
foreach ($arrays as $property => $property_values) {
$tmp = array();
foreach ($result as $result_item) {
foreach ($property_values as $property_key => $property_value) {
$tmp[] = $result_item + array($property_key => $property_value);
}
}
$result = $tmp;
}
return $result;
}
但是,这并不能完全满足我的要求,最终我得到了这样的结果:
array (size=4)
0 =>
array (size=1)
'attribute1' => string 'Step Through Bars' (length=17)
1 =>
array (size=2)
'attribute1' => string 'Step Through Bars' (length=17)
'attribute2' => string '6 metres' (length=8)
2 =>
array (size=2)
'attribute2' => string 'Gated' (length=5)
'attribute1' => string '3 metres' (length=8)
3 =>
array (size=1)
'attribute2' => string 'Gated' (length=5)
再次提供任何帮助将不胜感激。
答案 0 :(得分:1)
将此作为您的组合功能
取自here
的修改后的代码function combinations($arrays) {
$result = array(array());
foreach ($arrays as $key => $values) {
$tmp = array();
foreach ($result as $item) {
foreach ($values as $k=>$value) {
$tmp[] = array_merge($item, array($key.'-'.$k => $value));
}
}
$result = $tmp;
}
return $result;
}
答案 1 :(得分:0)
代替在下一行上使用while
while($row = $attributeResult->fetch(PDO::FETCH_ASSOC)){
使用foreach循环获取密钥配对值。例如
foreach($databaseFetchedRecord as $mykey=>$myvalue)
希望对您有帮助。