在PHP

时间:2018-07-27 08:39:59

标签: php arrays sorting

我正在创建一个网站,并且正在尝试对数组进行一些复杂的操作以使其正常工作。

这是一个电子商务网站,我网站上的每个产品都可以具有许多属性。我正在尝试获取属性的每种组合以分别为它们定价。

首先,我得到一个具有属性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)

再次提供任何帮助将不胜感激。

2 个答案:

答案 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)

希望对您有帮助。