如何从键数组中获取数组的最后一个元素?

时间:2016-02-18 14:32:35

标签: php multidimensional-array associative-array

$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; }

3 个答案:

答案 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)

这是代码的'重做',因为之前的答案没有做到任何人想要的。

要求:

鉴于:

  • 1)ON,例如root
  • 2)要添加的数据数组($section[0]
  • 3)带有空数组的'entry'键,用于添加数据。

结果:

  • 将当前空数组替换为$newData

由于这是$newData,我使用术语tree来引用其中的条目。

我如何选择接近它。

1)想象一下,你有$node(TreeWalk)可以“访问”树中的每个节点。

2)它可以在节点上运行任何class(访客)。

3)可以通过callable

修改节点

因此,假设visitor类存在,则执行所需操作的方法变为:

  • 撰写TreeWalk以确定所需的visitor并进行更新。

这就是这里提供的。

我将提供'TreeWalk'类,但这是一个'general treewalk'类,用于运行将更新正确节点的'nodeProcessor'。

来源和示范:

_Update:添加代码以执行OP要求的内容......

代码(nodeProcessor):

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; 
    }
};

TreeWalk接口:

$tree = new TreeWalk($parent, $updateNode, $updateData);
$tree->treeWalk();