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