首页 > 解决方案 > 在PHP中对'key => value'对多维数组进行排序

问题描述

我正在创建一个站点,我正在尝试用数组做一些复杂的事情来让它工作。

它适用于电子商务网站,我网站上的每个产品都可以有许多属性。我试图让每个属性组合分别为它们定价。

首先,我得到一个属性 ids ( $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”开始的数组的索引。

在网上找到另一个函数在这里排序如何在 PHP 中生成多个数组中项目的所有组合

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)

标签: phparrayssorting

解决方案


试试这个作为你的组合功能

修改后的代码取自这里

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;
}

推荐阅读