Создание имени ключа массива с помощью динамического массива

Я пытаюсь получить в приведенном ниже примере имена ключей для каждого измерения, чтобы оно выглядело примерно так:

Array
(
[Mobile] => Array
(
[0] => Array
(
[product_id] => 007
[product_name] => Blackberry R-900 Mobile
[product_price] => £450
[product_status] => 1
[product_category] => Mobile
)

Вместо приведенного ниже примера
Я включил класс, который я использую для создания массива, в классифицированный массив и его использование.

Функция appendNode в array2arraytree — это то место, где алгоритм фактически создает новый массив для каждой категории.

Спасибо за любую помощь.

Пример:

Array
(
[0] => Array
(
[0] => Array
(
[product_id] => 007
[product_name] => Blackberry R-900 Mobile
[product_price] => £450
[product_status] => 1
[product_category] => Mobile
)

[1] => Array
(
[product_id] => 001
[product_name] => Wespro Multi-SIM & Touch-screen Mobile
[product_price] => £150
[product_status] => 1
[product_category] => Mobile
)

[2] => Array
(
[product_id] => 004
[product_name] => Sigmatel MP4/MP3 + Camera Mobile
[product_price] => £150
[product_status] => 1
[product_category] => Mobile
)

)

[1] => Array
(
[0] => Array
(
[product_id] => 033
[product_name] => 8 GB Pendrive
[product_price] => £14.99
[product_status] => 0
[product_category] => Computers
)

[1] => Array
(
[product_id] => 334
[product_name] => 250 GB Portable Hard Drive
[product_price] => £79.99
[product_status] => 1
[product_category] => Computers
)

)

[2] => Array
(
[0] => Array
(
[product_id] => 033
[product_name] => The White Tiger – Aravind Adiga
[product_price] => £29.99
[product_status] => 1
[product_category] => Books
)

[1] => Array
(
[product_id] => 4501
[product_name] => The Final Reckoning - Sam Bourne
[product_price] => £19.99
[product_status] => 0
[product_category] => Books
)

[2] => Array
(
[product_id] => 034
[product_name] => The Final Reckoning - Sam Bourne
[product_price] => £15.79
[product_status] => 0
[product_category] => Books
)

)

)

Использование:

<?php
require_once("array2arraytree.php");
$arrProducts=array(
array(
"product_id"            => "007",
"product_name"          => "Blackberry R-900 Mobile",
"product_price"         => "£450",
"product_status"        =>"1",
"product_category"      =>"Mobile"),
array(
"product_id"            => "033",
"product_name"          => "8 GB Pendrive",
"product_price"         => "£14.99",
"product_status"        => "0",
"product_category"      => "Computers"),
array(
"product_id"            => "033",
"product_name"          => "The White Tiger – Aravind Adiga",
"product_price"         => "£29.99",
"product_status"        => "1",
"product_category"      => "Books"),
array(
"product_id"            => "4501",
"product_name"          => "The Final Reckoning - Sam Bourne",
"product_price"         => "£19.99",
"product_status"        => "0",
"product_category"      => "Books"),
array(
"product_id"            => "001",
"product_name"          => "Wespro Multi-SIM & Touch-screen Mobile",
"product_price"         => "£150",
"product_status"        => "1",
"product_category"      => "Mobile"),
array(
"product_id"            => "004",
"product_name"          => "Sigmatel MP4/MP3 + Camera Mobile",
"product_price"         => "£150",
"product_status"        => "1",
"product_category"      => "Mobile"),
array(
"product_id"            => "034",
"product_name"          => "The Final Reckoning - Sam Bourne",
"product_price"         => "£15.79",
"product_status"        => "0",
"product_category"      => "Books"),
array(
"product_id"            => "334",
"product_name"          => "250 GB Portable Hard Drive",
"product_price"         => "£79.99",
"product_status"        => "1",
"product_category"      => "Computers")
);

$objTree=new Array2ArrayTree($arrProducts,"product_category");
$arrTree=$objTree->makeTree();
print("<pre>");
print_r($arrTree);
print("</pre>");
?>

Класс Array2ArrayTree:

class Array2ArrayTree
{
public $arrOriginal = array();
public $arrDummy = array();
public $strKey = "";

public function __construct($arrData, $arrKey)
{
$this->arrOriginal = $arrData;
$this->strKey = $arrKey;
$this->arrDummy = array();
}

public function makeTree()
{
for ($i = 0; $i <= sizeof($this->arrOriginal) - 1; $i++) {
$keyPosition = $this->searchKey($this->arrOriginal[$i][$this->strKey]);
if ($keyPosition == -1) {
$this->addNode($this->arrOriginal[$i]);
} else {
$this->appendNode($this->arrOriginal[$i], $keyPosition);
}
}
return $this->arrDummy;
}

function searchKey($strCurrentValue)
{
for ($i = 0; $i <= sizeof($this->arrDummy) - 1; $i++) {
if ($this->arrDummy[$i][0][$this->strKey] == $strCurrentValue) {
return $i;
}
}
return - 1;
}

function addNode($arrNode)
{
$this->arrDummy[sizeof($this->arrDummy)][0] = $arrNode;
}

function appendNode($arrNode, $keyPosition)
{
array_push($this->arrDummy[$keyPosition], $arrNode);
}
}
?>

2

Решение

Должно быть еще проще:

public function makeTree()
{
foreach($this->arrOriginal as $value) {
$this->arrDummy[$value[$this->strKey]][] = $value;
}
return $this->arrDummy;
}
0

Другие решения

Я думаю, что это будет работать — сопоставить массив, чтобы получить ключи, которые вы хотите, а затем использовать array_filter чтобы получить только предметы в этой категории:

//get the keys you want:
$keys = array_unique(array_map(function($item) { return $item['product_category']; }, $array));
$return = [];
foreach($keys as $key) {
//filter the array to the one's in the current category, and reindex them to 0:
$return[$key] = array_values(array_filter($array, function($item) use ($key) {
return $item['product_category'] == $key;
}));
}
0