我有一个使用
从图像中取出的数组exif_read_data($image, 0, true)
数组本身可以包含未知数量的键/值(也可以是0) 该阵列在某些部分也是多维的。
来自exif_read_data的数组示例:
Array
(
[FILE] => Array
(
[FileName] => f-20110129_004_pp.jpg
[FileDateTime] => 0
[FileSize] => 3566966
[FileType] => 2
[MimeType] => image/jpeg
[SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, GPS
)
[COMPUTED] => Array
(
[html] => width="2576" height="1936"
[Height] => 1936
[Width] => 2576
[IsColor] => 1
[ByteOrderMotorola] => 0
[ApertureFNumber] => f/2.8
[Thumbnail.FileType] => 2
[Thumbnail.MimeType] => image/jpeg
)
[IFD0] => Array
(
[ImageWidth] => 2576
[ImageLength] => 1936
[BitsPerSample] => Array
(
[0] => 8
[1] => 8
[2] => 8
)
[Make] => Nokia
[Model] => N900
[Orientation] => 1
[SamplesPerPixel] => 3
[XResolution] => 3000000/10000
[YResolution] => 3000000/10000
[ResolutionUnit] => 2
[Software] => Adobe Photoshop CS5 Windows
[DateTime] => 2011:01:29 09:37:30
[YCbCrPositioning] => 1
[Exif_IFD_Pointer] => 276
[GPS_IFD_Pointer] => 658
)
[THUMBNAIL] => Array
(
[Compression] => 6
[XResolution] => 72/1
[YResolution] => 72/1
[ResolutionUnit] => 2
[JPEGInterchangeFormat] => 978
[JPEGInterchangeFormatLength] => 5525
)
[EXIF] => Array
(
[ExposureTime] => 1/500
[FNumber] => 14/5
[ExposureProgram] => 0
[ISOSpeedRatings] => 100
[ExifVersion] => 0210
[DateTimeOriginal] => 2011:01:29 09:37:30
[DateTimeDigitized] => 2011:01:29 09:37:30
[ShutterSpeedValue] => 8/1
[ApertureValue] => 297/100
[LightSource] => 0
[Flash] => 0
[FocalLength] => 26/5
[FlashPixVersion] => 0100
[ColorSpace] => 1
[ExifImageWidth] => 2576
[ExifImageLength] => 1936
[CustomRendered] => 0
[ExposureMode] => 0
[WhiteBalance] => 0
[DigitalZoomRatio] => 1/1
[SceneCaptureType] => 0
[GainControl] => 0
[Contrast] => 0
[Saturation] => 0
)
[GPS] => Array
(
[GPSVersion] =>
[GPSLatitudeRef] => N
[GPSLatitude] => Array
(
[0] => 22/1
[1] => 12937/1000
[2] => 0/1
)
[GPSLongitudeRef] => E
[GPSLongitude] => Array
(
[0] => 113/1
[1] => 32886/1000
[2] => 0/1
)
[GPSAltitudeRef] =>
[GPSAltitude] => 255/1
[GPSTimeStamp] => Array
(
[0] => 9/1
[1] => 37/1
[2] => 30/1
)
[GPSMapDatum] => WGS-84
[GPSDateStamp] => 2011:01:29
)
)
我的问题是如何创建一个只显示我选择的键作为键/值对的函数,即使它位于数组的第二维或第三维中?
例如 - 如果我只想选择[ImageWidth] , [ImageLength] , [XResolution] , [GPSTimeStamp] and [GPSLatitude] ..
我会把它传递给像:
这样的函数$keys_array = (ImageWidth , ImageLength, XResolution, GPSTimeStamp , GPSLatitude)
然后
function select_keys_from_array ($keys_array='') {
// if $keys_array=='' then get all ..
//identify the dimension or flatten - and get only my keys and display key/value
}
我选择了这些键作为示例,因为其中一些是二级的,有些实际上是数组本身..
还有一个问题是,理论上可以复制密钥(用户密钥) - 但是驻留在不同的二级数组中(因此不会在名义上重复)。
我想我需要首先“扁平化”它,然后以某种方式“传递”我想要的键的数组 - 但我似乎无法让它正确。
有人知道任何现成的类/功能/片段吗?
答案 0 :(得分:1)
编写一个递归函数,将多维数组转换为平数数组,并消除重复键或不需要的键。
function multi2flat($array)
{
$return = array();
array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
return $return;
}
答案 1 :(得分:1)
您不一定需要将其展平 - 实际上,这样做可能会覆盖您提到的可能出现在多个子阵列中的那些键。您只需要能够使用递归成功遍历数组(包括嵌套数组)(例程将从头到尾读取单个数组,但会为遇到的每个子数组递归调用自身)。一旦你可以像这样走路,那么你可以简单地将你遇到的键与你想要的键进行比较。
如果您希望特定版本的密钥出现在多个位置,那么您将不得不以某种方式限定它们(“范围”它们) - 例如,使用COMPUTED.Height而不仅仅是Height。您的步行算法必须跟踪通过数组的路径(即,它已走过的父数组链以获得那么远)以允许这种比较。
答案 2 :(得分:1)
(免责声明;可能会做古怪的事情,未经过充分测试 - 应该没事了)
上次修改;第一个更好,因为它没有排除数组值(,如坐标等)
function array_by_keys_recursive(array $keys, array $array) {
$results = array();
foreach ($keys as $key) {
if (isset($array[$key])) {
$results[$key] = $array[$key];
continue;
}
foreach ($array as $value) {
if (\is_array($value)) {
$results = \array_replace($results,
\array_by_keys_recursive(array($search), $value));
}
}
}
return $results;
}
测试:
$array = array(
'a' => 1,
'b' => 2,
'c' => array(
'd' => 3,
'e' => 4,
),
'f' => 5,
'g' => array(
'h' => array(
'i' => 6,
'j' => 7,
),
'k' => 8,
),
);
\var_dump(\array_by_keys_recursive(array('a', 'b', 'c', 'h', 'i', 'j'), $array));
结果:
array(6) {
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
array(2) {
["d"]=>
int(3)
["e"]=>
int(4)
}
["h"]=>
array(2) {
["i"]=>
int(6)
["j"]=>
int(7)
}
["i"]=>
int(6)
["j"]=>
int(7)
}
答案 3 :(得分:1)
<?
$x = Array
(
'FILE' => Array
(
'FileName' => 'f-20110129_004_pp.jpg',
'FileDateTime' => 0,
'FileSize' => 3566966,
'FileType' => 2,
'MimeType' => 'image/jpeg',
'SectionsFound' => 'ANY_TAG, IFD0, THUMBNAIL, EXIF, GPS',
),
'COMPUTED' => Array
(
'html' => 'width="2576" height="1936"',
'Height' => 1936,
'Width' => 2576,
'IsColor' => 1,
'ByteOrderMotorola' => 0,
'ApertureFNumber' => 'f/2.8',
'Thumbnail.FileType' => 2,
'Thumbnail.MimeType' => 'image/jpeg',
),
'IFD0' => Array
(
'ImageWidth' => 2576,
'ImageLength' => 1936,
'BitsPerSample' => Array
(
'0' => 8,
'1' => 8,
'2' => 8,
),
'Make' => 'Nokia',
'Model' => 'N900',
'Orientation' => 1,
'SamplesPerPixel' => 3,
'XResolution' => '3000000/10000',
'YResolution' => '3000000/10000',
'ResolutionUnit' => 2,
'Software' => 'Adobe Photoshop CS5 Windows',
'DateTime' => '2011:01:29 09:37:30',
'YCbCrPositioning' => 1,
'Exif_IFD_Pointer' => 276,
'GPS_IFD_Pointer' => 658,
),
'THUMBNAIL' => Array
(
'Compression' => 6,
'XResolution' => '72/1',
'YResolution' => '72/1',
'ResolutionUnit' => 2,
'JPEGInterchangeFormat' => 978,
'JPEGInterchangeFormatLength' => 5525,
),
'EXIF' => Array
(
'ExposureTime' => '1/500',
'FNumber' => '14/5',
'ExposureProgram' => 0,
'ISOSpeedRatings' => 100,
'ExifVersion' => '0210',
'DateTimeOriginal' => '2011:01:29 09:37:30',
'DateTimeDigitized' => '2011:01:29 09:37:30',
'ShutterSpeedValue' => '8/1',
'ApertureValue' => '297/100',
'LightSource' => 0,
'Flash' => 0,
'FocalLength' => '26/5',
'FlashPixVersion' => '0100',
'ColorSpace' => 1,
'ExifImageWidth' => 2576,
'ExifImageLength' => 1936,
'CustomRendered' => 0,
'ExposureMode' => 0,
'WhiteBalance' => 0,
'DigitalZoomRatio' => '1/1',
'SceneCaptureType' => 0,
'GainControl' => 0,
'Contrast' => 0,
'Saturation' => 0,
),
'GPS' => Array
(
'GPSVersion' => '',
'GPSLatitudeRef' => 'N',
'GPSLatitude' => Array
(
'0' => '22/1',
'1' => '12937/1000',
'2' => '0/1',
),
'GPSLongitudeRef' => 'E',
'GPSLongitude' => Array
(
'0' => '113/1',
'1' => '32886/1000',
'2' => '0/1',
),
'GPSAltitudeRef' => '',
'GPSAltitude' => '255/1',
'GPSTimeStamp' => Array
(
'0' => '9/1',
'1' => '37/1',
'2' => '30/1',
),
'GPSMapDatum' => 'WGS-84',
'GPSDateStamp' => '2011:01:29',
),
);
function get_values( $data, $keys ) {
$ret = Array();
foreach( $data as $k => $v ) {
if( is_array( $v ) ) {
$t = get_values( $v, $keys );
if( is_array( $t ) && sizeOf( $t ) > 0 ) {
$ret[$k] = $t;
}
} else {
if( in_array( $k, $keys ) ) {
$ret[ $k ] = $v;
}
}
}
return $ret;
}
print_r( get_values( $x, Array( 'ImageWidth', 'ImageLength', 'XResolution', 'GPSLatitude' ) ) );
&GT;