$parent
要求:
第1步:转到$parent[2]
最后一个元素(即)$parent[1]
step2:从b-key
检查所有具有数组值的键。这里b-key
有数组值。转到b-key[3]
最后一个元素(即)b-key[3]
step3:从16
检查所有具有数组值的键。这里"16"=>array(array("newdata"))
有数组值。在此附加新数据。
预期输出: #import <Foundation/Foundation.h>
#import <iTunesLibrary/ITLibrary.h>
#import <iTunesLibrary/ITLibMediaItem.h>
#import <iTunesLibrary/ITLibArtwork.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSError *error = nil;
ITLibrary *library = [ITLibrary libraryWithAPIVersion:@"1.0" error:&error];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (library)
{
//NSArray *playlists = library.allPlaylists; // <- NSArray of ITLibPlaylist
NSArray *tracks = library.allMediaItems; // <- NSArray of ITLibMediaItem
[tracks enumerateObjectsUsingBlock:^(ITLibMediaItem* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.artworkAvailable) {
ITLibArtwork* artWork=obj.artwork;
//NSData* d=artWork.imageData;
switch (artWork.imageDataFormat) {
case ITLibArtworkFormatPNG:{
NSURL* fileURL=obj.location;
NSString* fs=fileURL.lastPathComponent;
NSString* path=[fileURL.path stringByReplacingOccurrencesOfString:fs withString:@"Folder.png"];
if (![fileManager fileExistsAtPath:path]){
[artWork.imageData writeToFile:path atomically:YES];
}
}
break;
case ITLibArtworkFormatJPEG:{
NSURL* fileURL=obj.location;
NSString* fs=fileURL.lastPathComponent;
NSString* path=[fileURL.path stringByReplacingOccurrencesOfString:fs withString:@"Folder.jpg"];
if (![fileManager fileExistsAtPath:path]){
[artWork.imageData writeToFile:path atomically:YES];
}
}
break;
default:
break;
}
}
}];
NSLog(@"End reached");
}
}
return 0;
}
答案 0 :(得分:2)
如果我正确阅读了您的评论,您就会知道所有密钥,并希望将元素添加到可通过这些密钥访问的数组中。
在这种情况下,您需要将它附加到该元素的末尾,只需:
$section['id1']['id2']['id3'][] = $the_array_you_want_to_add;
修改:如果有更多图层,并且您需要先获取$section
的最后一个元素,则可以使用以下内容:
$last_key_of_section = end(array_keys($section));
$section[$last_key_of_section]['id1']['id2']['id3'][] = $the_array_you_want_to_add;
答案 1 :(得分:1)
展示我的评论:
$ref = &$section;
while (is_array(end($ref))) {
$key = key($ref);
$ref = &$ref[$key];
}
array_push($ref, array('1','2','3'));
答案 2 :(得分:1)
这是代码的'重做',因为之前的答案没有做到任何人想要的。
要求:
鉴于:
ON
,例如root
$section[0]
)结果:
$newData
。由于这是$newData
,我使用术语tree
来引用其中的条目。
我如何选择接近它。
1)想象一下,你有$node
(TreeWalk)可以“访问”树中的每个节点。
2)它可以在节点上运行任何class
(访客)。
3)可以通过callable
因此,假设visitor
类存在,则执行所需操作的方法变为:
TreeWalk
以确定所需的visitor
并进行更新。这就是这里提供的。
我将提供'TreeWalk'类,但这是一个'general treewalk'类,用于运行将更新正确节点的'nodeProcessor'。
_Update:添加代码以执行OP要求的内容......
1)它使用的数据:
node
2)要在树中的每个节点上运行的代码
// new data to add to the node
$updateData = array( 'key' => 16, // This must be the correct type i.e string '16' will not match!
'data' => array('name666' => 'Kilroy_666',
'contents666' =>
'Contents_666',
'id666' => array())
);
/*
* It can be any `callable`... I use a closure but it could be a function or a method
*
* It will use:
* o $tree : instance passed as a parameter
*
* o $tree->currentKey : identify which node to update
* o $tree->currentNode : a reference to the node identified by the currentKey
*
* o $tree->processorData : This can be any data that you need for this routine
* to do what you want.
*
* we have: array('key' => 16,
'data' => array('hello', 'node 16'))
*
* it needs to identify the correct node and update it with the new data
*/
$updateNode = function (TreeWalk $tree) {
if ($tree->currentKey === $tree->processorData['key']) {
$path = $tree->showCurrentPath();
$tree->currentNode = $tree->processorData['data'];
$tree->endTreeWalk = true;
return $path;
}
};
$tree = new TreeWalk($parent, $updateNode, $updateData);
$tree->treeWalk();