Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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,我有一个相当复杂的数组操作,或者至少对我来说很复杂。假设我得到了这样的数组 $myArr['url_1']['linktypes']['follow'] = 10; $myArr['url_1']['linktypes']['nofollow'] = 20; $myArr['url_1']['linktypes']['other'] = 30; $myArr['url_2']['linktypes']['follow'] = 40; $myArr['url_2']['linktypes']['

我有一个相当复杂的数组操作,或者至少对我来说很复杂。假设我得到了这样的数组

$myArr['url_1']['linktypes']['follow'] = 10;
$myArr['url_1']['linktypes']['nofollow'] = 20;
$myArr['url_1']['linktypes']['other'] = 30;

$myArr['url_2']['linktypes']['follow'] = 40;
$myArr['url_2']['linktypes']['nofollow'] = 50;
$myArr['url_2']['linktypes']['other'] = 60;

$myArr['url_3']['linktypes']['follow'] = 70;
$myArr['url_3']['linktypes']['nofollow'] = 80;
$myArr['url_3']['linktypes']['other'] = 90;
而且很简单!我需要得到以下结果

array(
    array("id"=>1,"metric"=>'follow','url_1'=>10,'url_2'=>40,'url_3'=>70),
    array("id"=>2,"metric"=>'nofollow','url_1'=>20,'url_2'=>50,'url_3'=>80),
    array("id"=>3,"metric"=>'other','url_1'=>30,'url_2'=>60,'url_3'=>90)
);
这些数组元素是从$myArr调用创建的。我尝试了很多方法,但失败了很多次。希望有人有一个简短的,简单的逻辑来解决这个问题

谢谢。 编辑:这是我最短的一次尝试。我有很多不同的方法,但这段代码是大代码结构的一部分,这里的示例是为了简化我需要的逻辑而创建的

$linkStructure = array();
foreach($myArr as $links=>$value){
    $counter = 0;

    foreach($value['linktypes'] as $ltKey => $ltValue){
        if($linkStructure[$counter]["id"] && $linkStructure[$counter]["metric"] == $ltKey){
            $linkStructure[$counter][$links] = $ltValue;
        }
        else{
            $linkStructure[$counter]["id"] = $counter;
            $linkStructure[$counter]["metric"] = $ltKey;
            $linkStructure[$counter][$links] = $ltValue;
        }
    }

} 

我发誓我试过如何证明自己更好我不知道。请不要折磨我。如果您有任何想法,请与我分享,这是否是我要求的太多了?

我无法很好地解释这一点,因此我将使用代码:

$fixedArr = array();
$idCount = 1;

foreach($myArr as $title=>$subArr)
  foreach($subArr['linktypes'] as $metric=>$val) {
    if(!array_key_exists($metric)) {
      $fixedArr[$metric] = array();
      $fixedArr[$metric]['id'] = $idCount;
      $fixedArr[$metric]['metric'] = $metric;
      $idCount += 1;
    }
    $fixedArr[$metric][$title] = $val;
  }
应该这样做

但我应该说,这些评论是正确的,构建数组的更好方法如下:

Array {
  [url_*] => Array {
    [metric] => someValue;
  }
}

基本上与最初的方式相同,但尺寸更小。这就是您所提供的数据所需的全部内容。

这并不是阵列的实际工作方式。如果有4个URL会发生什么,你会如何检查它?许多不同类型的foreach循环,数组函数,但我不想把它们放在这里,因为它们是错误的。如果需要,我可以发布一些,但我不认为它们会有帮助。@ufucuk:即使它们是错误的,也发布它们,只要告诉我们您已经尝试过了。id在源数组中的什么位置?在原始帖子中发布,而不是在注释中发布。您是否尝试过此代码以查看结果?我为你做了,第一个是bug,第二个是当你修复bug时它不起作用。不是直接的,但是我已经做了很多次类似的操作。这基本上就是我使用的代码。这将有助于了解它的缺陷。使用结果数组的方法只接受这种类型的结构。如果我能控制它,我真的会创造一个更好的设计。更新。它现在应该遵循你的结构,数组“follow”=>数组“id”=>int 7“metric”=>字符串“follow”length=6“nofollow”=>数组“id”=>int 8“metric”=>字符串“nofollow”length=8“url\u 3”=>int 80“other”=>数组“id”=>int 6“metric”=>字符串“other”length=5