大家好,我有一个巨大的数组作为搜索结果返回,我想执行以下操作:
遍历数组并为每个具有相同“spubid”的记录添加以下键/值:“sfirst、smi、slast”到本例中的父数组成员 $a[0]。因此,结果将保留 $a[0],但将数组中其他成员的 sfirst、smi 和 slast 的值添加到其中(因为它们都具有相同的“spubid”)。我认为将键值 (1, 2, 3) 添加到关联键 (sfirst1=> "J.", smi1=>"F.", slast1=>"Kennedy") 就可以了。然后我想用那个“spubid”删除(unset())数组中的其余成员。这是我要返回的数组的一个简化示例,在此示例中,所有记录都具有相同的“spubid”:
Array (
[0] =>
Array (
[spubid] => A00502
[sfirst] => J.
[smi] => A.
[slast] => Doe
[1] =>
Array (
[spubid] => A00502
[sfirst] => J.
[smi] => F.
[slast] => Kennedy
[2] =>
Array (
[spubid] => A00502
[sfirst] => B.
[smi] => F.
[slast] => James
[3] =>
Array (
[spubid] => A00502
[sfirst] => S.
[smi] => M.
[slast] => Williamson
)
)
所以本质上我想保留 $a[0] 但向其添加新的键=>值(sfirst$key,smi$key,slast$key)并附加来自“sfirst,smi,slast”的值所有具有相同“spubid”的成员然后取消设置 $a[1]-[3]。
只是为了澄清我理想的最终结果是:
Array (
[0] =>
Array (
[spubid] => A00502
[sfirst] => J.
[smi] => A.
[slast] => Doe
[sfirst1] => J.
[smi1] => F.
[slast1] => Kennedy
[sfirst2] => B.
[smi2] => F.
[slast2] => James
[sfirst3] => S.
[smi3] => M.
[slast3] => Williamson
)
)
在大多数情况下,我会从一个更大的数组开始,其中包括大量的“spubid”,但 99% 的出版物都有不止一个作者,所以这个例程对于清理结果和制作显示的解析过程要容易得多。
***更新
我认为过度简化我的示例可能会使事情变得不清楚。我喜欢 Chacha102 和 zombat 的响应,但我的“父数组”包含的不仅仅是 pubid,它恰好是主键。我需要保留该记录中的许多其他数据,其中一小部分如下:
[spubid] => A00680
[bactive] => t
[bbatch_import] => t
[bincomplete] => t
[scitation_vis] => I,X
[dentered] => 2009-08-03 12:34:14.82103
[sentered_by] => pubs_batchadd.php
[drev] => 2009-08-03 12:34:14.82103
[srev_by] => pubs_batchadd.php
[bpeer_reviewed] => t
[sarticle] => A case study of bora-driven flow and density changes on the Adriatic shelf (January 1987)
.
.
.
.
.
每个搜索查询大约返回 40 列。与其像这些示例对 pubid 那样对它们进行硬编码,不如我如何在包含它们的同时仍然按照你们俩的建议进行更改。创建一个多维数组(正如你们俩所建议的那样)并且作者是多维的一部分非常好,谢谢你们的建议。
**** 更新:
这是我确定的解决方案,非常简单并且可以很好地完成工作。我确实最终创建了一个多维数组,因此作者在那里被分解。
过度简化的解决方案:
$apubs_final = array();
$spubid = NULL;
$ipub = 0;
foreach($apubs as $arec)
{
if($spubid != $arec['spubid'])
{
$ipub++;
$apubs_final[$ipub] = $arec;
// insert UNSET statements here for author data
$iauthor = 0;
$spubid = $arec['spubid'];
}
$iauthor++;
$apubs_final[$ipub]['authors'][$iauthor]['sauthor_first'] = $arec['sfirst'];
}
感谢所有回复的人,非常感谢您的帮助!
最佳答案
// First, probably the more parsable way.
foreach($array as $key => $values)
{
$end[$spuid] = $values;
$spuid = $values['spuid']
$end[$spuid]['authors'][] = array('sfirst' => $values['sfirst'],
'smi' => $values['smi'],
'slast' => $values['slast']);
}
这样会得到一个数组
Array(
[A00502] =>
Array(
[supid] => A00502
.... other values .....
[authors] =>
Array(
[0]=>
Array(
['sfirst'] => '',
['smi'] => '',
['slast'] => '')
)
)
)
如果您计划在页面上显示它,我发现这种方式更易于解析,因为它使用数组,因此您可以 foreach 作者,这就是我看到很多人为这样的属性所做的.
如果你真的想要你的理想格式,之后使用它
$count = 0;
foreach ($end as $supid => $values)
{
$other_end[$count] = $values;
$other_end[$count]['spuid'] = $spuid;
foreach($values['authors'] as $key => $author)
{
if($key == 0)
{
$suffix = '';
}
else
{
$suffix = $key;
}
$other_end[$count]['sfirst'.$suffix] = $author['sfirst'];
$other_end[$count]['smi'.$suffix] = $author['smi'];
$other_end[$count]['slast'.$suffix] = $author['slast'];
}
}
关于PHP数组解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1224919/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作