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_Multidimensional Array - Fatal编程技术网

PHP检查数组是否包含所有位置

PHP检查数组是否包含所有位置,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个数组: 例: 我有这个阵列: array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600"); 我需要检查每个“名称”是否包含最后一个数组的所有大小,如果不存在,我需要添加。 预期的结果是“name”AAA将重复11次,对于“name CC”“DD”等一个数组,重复11次,最后一个数组的所有大小都相同 我

我有一个数组: 例:

我有这个阵列:

array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
我需要检查每个“名称”是否包含最后一个数组的所有大小,如果不存在,我需要添加。 预期的结果是“name”AAA将重复11次,对于“name CC”“DD”等一个数组,重复11次,最后一个数组的所有大小都相同

我试着为每个人做2个比较,但无法与'name'AA和其他人区分开来 我还有场数。因此,我需要保留初始“计数”,每次添加缺少的位置时,我需要使新位置的“计数”值=0

有人能帮我检查一下吗? 我的实际代码

  $tmp22222=array();
        foreach ($result as &$v){
            foreach ($sizes as $s) {
                if($v['size']==$s) {
                    array_push($tmp22222, $v);
                break;
                }
                if(!in_array($tmp22222, $v['size'])){
                    $v['size'] = $s;
                    $v['count'] = 0;
                    array_push($tmp22222, $v);
                }

            }
        }


    var_dump($tmp22222);
预期结果:

array(
     array([name]=>AAA
           [size]=>300x250
           [count]=>10
          )
     array([name]=>AAA
           [size]=>160x600
           [count]=>9
          )
     array([name]=>AAA
           [size]=>728x90
           [count]=>3
          )
     array([name]=>AAA
           [size]=>300x600
           [count]=>0
          )
     array([name]=>AAA
           [size]=>300x300
           [count]=>0
          )
     array([name]=>AAA
           [size]=>120x600
           [count]=>0
          )
     array([name]=>AAA
           [size]=>100x72
           [count]=>0
          )
     array([name]=>AAA
           [size]=>970x250
           [count]=>0
          )
     array([name]=>AAA
           [size]=>750x200
           [count]=>0
          )
     array([name]=>AAA
           [size]=>120x60
           [count]=>0
          )
     array([name]=>AAA
           [size]=>200x600
           [count]=>0
          )

     array([name]=>CC
           [size]=>300x250
           [count]=>66
          )
     array([name]=>CC
           [size]=>160x600
           [count]=>55
          )
     array([name]=>CC
           [size]=>728x90
           [count]=>100
          )
     array([name]=>CC
           [size]=>300x600
           [count]=>0
          )
     array([name]=>CC
           [size]=>300x300
           [count]=>0
          )
     array([name]=>CC
           [size]=>120x600
           [count]=>0
          )
     array([name]=>CC
           [size]=>100x72
           [count]=>0
          )
     array([name]=>CC
           [size]=>970x250
           [count]=>0
          )
     array([name]=>CC
           [size]=>750x200
           [count]=>0
          )
     array([name]=>CC
           [size]=>120x60
           [count]=>0
          )
     array([name]=>CC
           [size]=>200x600
           [count]=>0
          )
已添加“计数”=0的所有位置
如您所见,第一个数组上的现有大小和计数继续使用相同的值,只需添加计数为0的新大小即可尝试以下简单解决方案:

    $array = array(
        array('name' => 'AAA',
            'size' => '300x250',
            'count' => '10',
        ),
        array('name' => 'AAA',
            'size' => '160x600',
            'count' => '9',
        ),
        array('name' => 'AAA',
            'size' => '728x90',
            'count' => '7',
        ),
        array('name' => 'CC',
            'size' => '300x250',
            'count' => '5',
        ),
        array('name' => 'CC',
            'size' => '160x600',
            'count' => '7',
        ),
        array('name' => 'DD',
            'size' => '728x90',
            'count' => '1',
        )
    );

    $size_array = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");

    //get unique name from original array
    $names = array_unique(array_column($array, 'name'));
    /**
 * for php < 5.5 change above line to
 *
   $names = array_map(function($element) {
     return $element['name'];
    }, $array);
    $names = array_unique($names);
 */
    foreach($names as $name){
        $size_exists_array = array_filter($array, function($val) use($name){
                if($val['name'] == $name){
                    return true;
                } else {
                    return false;
                }
        });

        //get already exists size
        $size = array_unique(array_column($size_exists_array, 'size'));
        /**
     * for php < 5.5 change above line to
     *
       $size = array_map(function($element) {
        return $element['size'];
      }, $size_exists_array);
      $size = array_unique($size);
     */
        //calculate difference of exist and available size
        $diff = array_diff($size_array, $size);

        //insert non exists size for name
        if($diff){
            foreach($diff as $dif){
                $array[] = array('name' => $name, 'size' => $dif, 'count' => '0',);
            }
        }
    }
    sort($array);

    print_r($array);

尝试以下简单的解决方案:

    $array = array(
        array('name' => 'AAA',
            'size' => '300x250',
            'count' => '10',
        ),
        array('name' => 'AAA',
            'size' => '160x600',
            'count' => '9',
        ),
        array('name' => 'AAA',
            'size' => '728x90',
            'count' => '7',
        ),
        array('name' => 'CC',
            'size' => '300x250',
            'count' => '5',
        ),
        array('name' => 'CC',
            'size' => '160x600',
            'count' => '7',
        ),
        array('name' => 'DD',
            'size' => '728x90',
            'count' => '1',
        )
    );

    $size_array = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");

    //get unique name from original array
    $names = array_unique(array_column($array, 'name'));
    /**
 * for php < 5.5 change above line to
 *
   $names = array_map(function($element) {
     return $element['name'];
    }, $array);
    $names = array_unique($names);
 */
    foreach($names as $name){
        $size_exists_array = array_filter($array, function($val) use($name){
                if($val['name'] == $name){
                    return true;
                } else {
                    return false;
                }
        });

        //get already exists size
        $size = array_unique(array_column($size_exists_array, 'size'));
        /**
     * for php < 5.5 change above line to
     *
       $size = array_map(function($element) {
        return $element['size'];
      }, $size_exists_array);
      $size = array_unique($size);
     */
        //calculate difference of exist and available size
        $diff = array_diff($size_array, $size);

        //insert non exists size for name
        if($diff){
            foreach($diff as $dif){
                $array[] = array('name' => $name, 'size' => $dif, 'count' => '0',);
            }
        }
    }
    sort($array);

    print_r($array);

如果更改数组格式,则会变得更简单:

// reformat array into ['AAA' => ['300x250' => 10, ..]]
$grouped = array_reduce($result, function (array $grouped, array $item) {
    $grouped[$item['name']][$item['size']] = $item['count'];
    return $grouped;
}, array());

// create default size => 0 mapping
$defaultSizes = array_fill_keys($sizes, 0);

// add default size => 0 map to each name group, doesn't overwrite existing values
$grouped = array_map(function (array $group) use ($defaultSizes) {
    return $group + $defaultSizes;
}, $grouped);

// reformat into original structure
$result = array_reduce(array_keys($grouped), function (array $result, array $name) use ($grouped) {
    foreach ($grouped[$name] as $size => $count) {
        $result[] = compact('name', 'size', 'count');
    }
    return $result;
}, array());

如果更改数组格式,则会变得更简单:

// reformat array into ['AAA' => ['300x250' => 10, ..]]
$grouped = array_reduce($result, function (array $grouped, array $item) {
    $grouped[$item['name']][$item['size']] = $item['count'];
    return $grouped;
}, array());

// create default size => 0 mapping
$defaultSizes = array_fill_keys($sizes, 0);

// add default size => 0 map to each name group, doesn't overwrite existing values
$grouped = array_map(function (array $group) use ($defaultSizes) {
    return $group + $defaultSizes;
}, $grouped);

// reformat into original structure
$result = array_reduce(array_keys($grouped), function (array $result, array $name) use ($grouped) {
    foreach ($grouped[$name] as $size => $count) {
        $result[] = compact('name', 'size', 'count');
    }
    return $result;
}, array());

这不是一种有效的方法,但它有很多组合

 $sizes = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
$ex = array(
     array("name"=>"AAA",
           "size"=>"300x250",
           "count"=>10
          ),
     array("name"=>"AAA",
           "size"=>"160x600",
           "count"=>9
          ),
     array("name"=>"AAA",
           "size"=>"728x90",
           "count"=>3
          ),
     array("name"=>"CC",
           "size"=>"300x250",
           "count"=>66
          ),
     array("name"=>"CC",
           "size"=>"160x600",
           "count"=>55
          ),
     array("name"=>"DD",
           "size"=>"728x90",
           "count"=>100
          )          
);

$reorderedEx = array();

foreach($ex as $item){
  $reorderedEx[$item["name"]][$item["size"]] = $item["count"];
}
foreach($sizes as $size){
  foreach($reorderedEx as $name=>$r){
        if(empty($reorderedEx[$name][$size])){
            $reorderedEx[$name][$size] = "0";
        }
  }
}
$reconstruct = array();
foreach($reorderedEx as $name => $val){
    foreach($val as $size => $count){
        $reconstruct[] = array("name" => $name,"size"=>$size,"count"=>$count);
    } 

}

echo "<pre>",print_r($reconstruct,true);

这不是一种有效的方法,但它有很多组合

 $sizes = array("300x250", "160x600", "728x90", "300x600", "300x300", "120x600", "100x72", "970x250", "750x200", "120x60", "200x600");
$ex = array(
     array("name"=>"AAA",
           "size"=>"300x250",
           "count"=>10
          ),
     array("name"=>"AAA",
           "size"=>"160x600",
           "count"=>9
          ),
     array("name"=>"AAA",
           "size"=>"728x90",
           "count"=>3
          ),
     array("name"=>"CC",
           "size"=>"300x250",
           "count"=>66
          ),
     array("name"=>"CC",
           "size"=>"160x600",
           "count"=>55
          ),
     array("name"=>"DD",
           "size"=>"728x90",
           "count"=>100
          )          
);

$reorderedEx = array();

foreach($ex as $item){
  $reorderedEx[$item["name"]][$item["size"]] = $item["count"];
}
foreach($sizes as $size){
  foreach($reorderedEx as $name=>$r){
        if(empty($reorderedEx[$name][$size])){
            $reorderedEx[$name][$size] = "0";
        }
  }
}
$reconstruct = array();
foreach($reorderedEx as $name => $val){
    foreach($val as $size => $count){
        $reconstruct[] = array("name" => $name,"size"=>$size,"count"=>$count);
    } 

}

echo "<pre>",print_r($reconstruct,true);


向我们展示你的代码:嗨@HalayemAnis,我添加了我的代码,谢谢如果我不存在,我需要添加-添加什么?对不起。AA从另一个阵列中只有3个大小。我必须添加缺失尺寸和计数为0的AA,AAA、CC等是否已修复?或者,您需要查看第一个数组来找出需要担心的名称吗?换句话说,结果是否总是包含AAA、CC和DD,或者是否会有更多的名称,或者不同的名称,或者可能不是全部三个?向我们展示您的代码:hi@HalayemAnis我添加了我的代码,thanksif不存在我需要添加-添加什么?抱歉。AA从另一个阵列中只有3个大小。我必须添加缺失尺寸和计数为0的AA,AAA、CC等是否已修复?或者,您需要查看第一个数组来找出需要担心的名称吗?换句话说,结果是否总是包含AAA、CC和DD,或者是否会有更多的名称,或者不同的名称,或者可能不是全部三个?我不知道为什么,$val['name']==$name是空的,所以不会显示任何内容您使用的php版本是PHP5.6,我使用了var_转储$val['code'];并检查它是否没有得到任何返回数组的内容,该数组包含原始数组中特定名称的所有大小。。只需使用print_r$size_existing_arrayi不知道为什么,$val['name']=$name是空的,所以不显示任何内容您使用的php版本是PHP5.6,我使用了var_dump$val['code'];并检查它是否没有得到任何返回数组的内容,该数组包含原始数组中特定名称的所有大小。。只需使用print_r$size_existing_array在第一个函数中为我提供了一个意外的“[”。这里:$grouped[$result['name'][$result['size']]=$result['count'];return$grouped;},[];您可能正在运行一个非常旧的PHP版本吗?[]只是[]本身,而不是$grouped[]是PHP 5.4+中数组的简写符号。如果您使用的是旧的:1升级,2将[]数组文字替换为旧数组。因此,将两个数组的最后一个参数[]替换为array,它应该可以工作。在第一个函数中,is给了我一个意外的“[”。这里:$grouped[$result['name'][$result['size']=$result['count'];return$grouped;},[];您可能正在运行一个非常旧的PHP版本吗?[]只是[]本身,而不是$grouped[]是PHP5.4+中数组的简写符号。如果您使用的是较旧的符号:1升级,2用旧数组替换[]数组文本。因此,替换最后一个参数[]对于这两个数组,使用数组减少,它应该可以工作。