Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的数组操作_Php_Arrays - Fatal编程技术网

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

我正在使用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' ,'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";