PHP中的数组操作
我正在使用PHP。我需要实现以下逻辑: 我的PHP中的数组操作,php,arrays,Php,Arrays,我正在使用PHP。我需要实现以下逻辑: 我的$List包含以下数据: array('id' =>'1','flag'=>'1','place1' =>'val2' ,'place2'=>'val3') array('id'=> '1','flag'=>'0','place1' =>'val3' ,'place2'=>'val7') array('id'=> '1','flag'=>'0','place1' =>'val4' ,'p
$List
包含以下数据:
array('id' =>'1','flag'=>'1','place1' =>'val2' ,'place2'=>'val3')
array('id'=> '1','flag'=>'0','place1' =>'val3' ,'place2'=>'val7')
array('id'=> '1','flag'=>'0','place1' =>'val4' ,'place2'=>'val8')
array('id'=> '1','flag'=>'0','place1' =>'val5' ,'place2'=>'val9')
array('id'=> '2','flag'=>'1','place1' =>'val10','place2'=>'val11')
array('id'=> '3','flag'=>'1','place1' =>'val11','place2'=>'val14')
我的逻辑是:
if (flag == 0){
Store the values of place1 ,Place2
in the Index of id
/*example
$store[1]= {place1}+{place2}
hence output:
store[1]= {val3+val4+val5}+{val7+val8+val9}
similarly
store[2]= empty
store[3]= empty
*/
}
else{
Print the Values of place1,place2 of its index
/* example
print place1[1]="val2" ,place2[1]='val3'
place1[2]="val10",place2[2]='val11'
place1[3]="val11",place2[3]='val14'
*/
}
我的部分代码段包含:
foreach ($List as $key => $val)
{
if($val['flag']!==0){
//how to implementation
}
else{
echo '$val['place1']'.'$val['place2']';
}
}
最好的方法是什么?有一个很好的函数用于从数组中筛选数据:。该函数需要一个回调函数,该函数将决定元素是否应保留在数组中。我们使用创建一个过滤器函数,并提取数组中感兴趣的部分
$reducingFunction = create_function('$value', 'return $value["flag"] == 0;');
$reduced = array_filter($list, $reducingFunction);
下一个整洁的函数()是转换数组元素的函数(即$value=$value['param1']),因此我们创建了另一个回调函数:
$extractingFunction = create_function('&$value, $key, $index', '$value = $value[$index];');
$valuesParam1 = $reduced;
$valuesParam2 = $reduced;
array_walk($valuesParam1, $extractingFunction, 'param1');
array_walk($valuesParam2, $extractingFunction, 'param1');
现在,我们有两个数组,其中包含我们需要的所有数据:
$store = array(1 => implode('', $valuesParam1).implode('', $valuesParam2));
我似乎不明白您希望数组$store包含什么。或者else分支应该做什么,因此这需要进一步解释。假设您在place1和place2中实际有数值,因此允许交换加法。如果您确实有文本并且需要大括号,那么稍后我将使用另一个传递存储连接这两个部分(但是我不理解{0}+{0})。 我试着把你的引号保留在其他部分。根本没有测试过
$store = array();
foreach ($List as $key => $val)
{
$id = $val['id'];
if (!array_key_exists($id, $store)) {
$store[$id] = 0;
}
if ($val['flag'] == 0) {
$store[$id] += $val['place1'];
$store[$id] += $val['place2'];
} else {
printf("place1[%d]=\"%s\",place2[%d]='%s'\n", $id, $val['place1'], $id, $val['place2']);
}
}
代码对新手很友好:
然后,您可以使用PHP快捷方式来总结:
$store[$val['id'] += $val['place1'] + $val['place2'];
单线操作不需要手镯:
if (isset($store[$val['id']]))
$store[$val['id'] = $store[$val['id']] + $val['place1'] + $val['place2'];
else
$store[$val['id']] = 0;
您也不需要“$key”变量
因此,代码变成:
$store = array();
foreach ($List as $val)
if (!$val['flag'])
if (isset($store[$val['id']]))
$store[$val['id'] += $val['place1'] + $val['place2'];
else
$store[$val['id']] = 0;
else
echo '$val['place1']'.'$val['place2']'."\n";
$store = array();
foreach ($List as $val)
if (!$val['flag'])
$store[$val['id'] = isset($store[$val['id']]) ? 0 : $store[$val['id']] + $val['place1'] + $val['place2'];
else
echo '$val['place1']'.'$val['place2']'."\n";
第3版:
使用三元运算符可以缩短if/else/set操作(注意它的可读性较差且速度较慢):
因此,代码变成:
$store = array();
foreach ($List as $val)
if (!$val['flag'])
if (isset($store[$val['id']]))
$store[$val['id'] += $val['place1'] + $val['place2'];
else
$store[$val['id']] = 0;
else
echo '$val['place1']'.'$val['place2']'."\n";
$store = array();
foreach ($List as $val)
if (!$val['flag'])
$store[$val['id'] = isset($store[$val['id']]) ? 0 : $store[$val['id']] + $val['place1'] + $val['place2'];
else
echo '$val['place1']'.'$val['place2']'."\n";
专业版
一旦你得到这个,检查soulmerge的代码。如果可以的话,使用函数式编程是非常明智的,因为它更小,并且结果可以通过管道相互传递,因此代码更易于重用。更重要的是,使用生成器通常会消耗更少的内存。你的问题是什么?你想要像sum(place1,place2)这样的东西,然后把这个int放在id字段中?在代码中,你如何显示呢@所有这些回复:这是plzsendtehcodez的一个明显的例子。该标记(plzsendtehcodez)对我来说意味着某人太懒了,无法自己进行编码,但对于初学者来说,请求的代码相当复杂。否则,分支只是根据Id排序,如果flag==0,则跳过。我认为,他明确地希望存储[Id]中填充0值,如果有一行具有此id,但没有行['flag']==0。您以前确实会过滤掉这些ID。但事实上,这个问题留下了很多悬而未决的问题。耶!GrGr点是正确的,并且在任何时候用于提取数据的存储[id],因为这里的id是位置1、位置2的“键”;啊,现在我明白了!id列统一了所涉及的数组。好的,提供的答案应该给你一个很好的起点,让你自己做剩下的事情。顺便说一句:出于性能原因,我这里不使用foreach,内置数组函数要快得多。如果你不在乎的话,你可以跳过这个。如果你想提高,你应该尝试一下——这并不难理解。考虑到你问了这么多问题,你想学习一些东西,对吧?就像soulmerge的解决方案一样,对于只有1个标志的id,你不会将$store[$id]设置为0,但根本不会设置$store[$id]。这就是为什么我将初始化放在if($val['flag']==0)块之前。$store[$val['id']=…行中缺少一个右括号。我刚才看到,对于每个带有0标志的id,您跳过第一行,因为存储设置为0,而不是$val['place1']+$val['place2']。
$store = array();
foreach ($List as $val)
if (!$val['flag'])
$store[$val['id'] = isset($store[$val['id']]) ? 0 : $store[$val['id']] + $val['place1'] + $val['place2'];
else
echo '$val['place1']'.'$val['place2']'."\n";