如何在php中从现有数组生成嵌套数组
我需要什么如何在php中从现有数组生成嵌套数组,php,arrays,Php,Arrays,我需要什么 我需要从现有阵列创建嵌套阵列 如果在数组中,两个值类型相同 根据他们的类型分组 like array[1]类型与array[2]类型相同,所以我需要将它们分组到单个嵌套数组中 这是数组结构 $data=$event['data']['pricing_detail']; [1] => Array ( [type] => Gene
- 我需要从现有阵列创建嵌套阵列
- 如果在数组中,两个值类型相同
- 根据他们的类型分组
- like array[1]类型与array[2]类型相同,所以我需要将它们分组到单个嵌套数组中
$data=$event['data']['pricing_detail'];
[1] => Array
(
[type] => General Public Tickets Adult
[amount] => 50
[comment] => (Working Days)
)
[2] => Array
(
[type] => General Public Tickets Adult
[amount] => 80
[comment] => (Saturday/ Sunday/ Holiday)
)
- 我需要像这样的输出
[1] => Array ( [type] => General Public Tickets Adult [metadata]=>array ( [0] =>array ( [amount] => 50 [comment] => (Working Days) ) [1]=>array ( [amount] => 80 [comment] => (Saturday/ Sunday/ Holiday) ) ) )
$data=$event['data']['pricing_detail'];
$metadata = array();
foreach($data as $key => $value)
{
if($value[1]['type'] == $value[2]['type'])
{
$metadata[$key]['amount'] = $value['amount'];
print_r($metadata);
}
else
{
echo "not matched";
}
}
- 我所面临的问题是我无法进行逻辑推理以得到预期的结果
$grouped = array();
foreach($data as $key => $value) {
$grouped[$value['type']][$key] = $value;
unset($grouped[$value['type']][$key]["type"]);
}
print_r($grouped);
foreach($grouped as $type => &$list)
$list = multisort($list, 'comment', SORT_DESC);
根据您的数组结构进行调整,我看不到示例中$data的实际结构
如果要对多级数组进行排序,可以使用此函数的变体:
/**
* sort an multidimensional array by any of it's fields and return sorted array
* ex.: $sorted = multisort($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
* IMPORTANT: This function uses mutlisort and will reindex numeric keys !
* @param array $data array to sort
* @param string $field name of field to sort by
* @param int $direction SORT_DESC or SORT_ASC constant
* @return array
*/
function multisort(){
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
这样使用:
$grouped = array();
foreach($data as $key => $value) {
$grouped[$value['type']][$key] = $value;
unset($grouped[$value['type']][$key]["type"]);
}
print_r($grouped);
foreach($grouped as $type => &$list)
$list = multisort($list, 'comment', SORT_DESC);
循环数组,存储类型及其所属的数组。 然后循环类型并添加te值
//store types and the arrays the belong to
foreach($data as $k=>$v){
$type[$v['type']][]=$k;
}
//loop types, creating result array
foreach($type as $k=>$v){
$tmp=array(
'type'=>$k,
'metadata'=>array()
);
//loop all the arrays of this type
foreach($v as $w){
//store in TMP
$t=array(
'amount' => $vals[$w]['amount'],
'comment' => $vals[$w]['comment']
);
//sort TMP on EMPTY value
usort($t,function ($a, $b) {
if($a == '' && $b != '') return 1;
if($b == '' && $a != '') return -1;
if($b == 0){return 1;}
return 0;
});
//store
$tmp['metadata'][]=$t;
}
$result[]=$tmp;
}
echo '<pre>'.print_r($result,true).'<pre>';
结果:
[编辑]更新为usort
,用于排序空的“评论”
[edit]在usort
中添加了一行,以防止在票证=0时进行不必要的排序
你能帮我解决如何根据数据结构对[comment]排序的问题吗?比如说,如果comment“string”应该在顶部,否则应该在ArraI的较低索引中。对不起,我不太清楚你需要什么,如果[comment]不是空的,那么它应该在顶部,否则如果[comment]如果是空的,我们应该将空评论放在较低的顺序。你是说如果评论是空的,你想切换它们吗?因此,结果数组变成
[0]=>数组([comment]=>'dadada',[amount]=>10)
或[0]=>数组([amount]=>99,[comment]=>empty)
?是的,我只想根据empty/data对关联数组进行排序。如果comment在上面,您可以对comment进行排序吗?否则我们应该将空注释放在较低的位置