当信息不恒定时从 WP 数据库获取数据
Getting data from WP database when info is not constant
这是我的数组:
Array
(
[0] => Array
(
[id] => 1387
[form_id] => 2
[date_created] => 2018-05-17 21:34:37
----> [67] => a:1:{i:0;a:7:{s:17:"wp_attachement_id";i:5828;s:9:"mime_type";s:9:"video/mp4";s:9:"file_path";s:89:"/home/xxx/public_html/wp-content/uploads/2018/05/703c94b2b97a6479113d9e3020952891.mp4";s:5:"title";s:3:"xxx";s:11:"description";s:3:"xxx";s:8:"video_id";s:6:"QRSTUV";s:9:"video_url";s:43:"https://www.youtube.com/watch?v=QRSTUV";}}
[36] => New Harpshire
[34] => Borristown
)
)
以下将打印视频 ID:
$undid = unserialize($entry['0']['67']);
echo $undid['0']['video_id'];
问题是数字“67”不保持不变。如果我不知道“67”是什么,我该如何检索 video_id?
我为你准备了一个快速 Demo。
理想情况下,您会找到一种方法将键设置为语义名称而不是 '67'
。但如果你不能,而且它总是不同的,那么你最好的选择是检查 预期值 .
由于您需要一个序列化数组,我们可以通过 运行 通过 unserialize()
函数检查序列化值。 注意: 这将触发 E_NOTICE 级别的错误,因此您可能希望用 @unserialize()
抑制那些错误(@
抑制错误)。虽然抑制错误通常不是一个好主意,这些是我们预期会触发的错误,因此忽略它们应该是安全的。
因此,当我们通过 unserialize()
传递内容时,我们可以检查它是否将 $undid
设置为真值。一旦完成,我们需要确保我们拥有 正确的 序列化信息,这样我们就可以查看是否设置了 $undid[0]['video_id']
,如果是,则回显该值(或其他任何内容)否则你想用它来做),然后 break
foreach
循环,因为一旦满足我们的条件就不再需要 运行。
这并不是最完美的解决方案,但除非您能弄清楚如何命名该键的语义,如 file_upload_array
,否则最好的选择是遍历这些值,直到找到您需要的值。只要您没有难以想象的字段数量,这应该会很快工作。
$entry = [
[
'id' => 1387,
'form_id' => 2,
'date_created' => '2018-05-17 21:34:37',
'67' => 'a:1:{i:0;a:7:{s:17:"wp_attachement_id";i:5828;s:9:"mime_type";s:9:"video/mp4";s:9:"file_path";s:89:"/home/xxxxxxx/public_html/wp-content/uploads/2018/05/703c94b2b97a6479113d9e3020952891.mp4";s:5:"title";s:3:"xxx";s:11:"description";s:3:"xxx";s:8:"video_id";s:6:"QRSTUV";s:9:"video_url";s:43:"https://www.youtube.com/watch?v=QRSTUV22222";}}',
'36' => 'New Harpshire',
'34' => 'Borristown',
]
];
foreach( $entry[0] as $key => $val ){
if( $undid = @unserialize( $val ) ){ // unserialize returns E_NOTICE warnings on non-serialized items. @ suppresses that.
if( isset( $undid[0]['video_id'] ) ){ // Make sure this is the correct serialized field
echo $undid[0]['video_id'];
break;
}
}
}
这是我的数组:
Array
(
[0] => Array
(
[id] => 1387
[form_id] => 2
[date_created] => 2018-05-17 21:34:37
----> [67] => a:1:{i:0;a:7:{s:17:"wp_attachement_id";i:5828;s:9:"mime_type";s:9:"video/mp4";s:9:"file_path";s:89:"/home/xxx/public_html/wp-content/uploads/2018/05/703c94b2b97a6479113d9e3020952891.mp4";s:5:"title";s:3:"xxx";s:11:"description";s:3:"xxx";s:8:"video_id";s:6:"QRSTUV";s:9:"video_url";s:43:"https://www.youtube.com/watch?v=QRSTUV";}}
[36] => New Harpshire
[34] => Borristown
)
)
以下将打印视频 ID:
$undid = unserialize($entry['0']['67']);
echo $undid['0']['video_id'];
问题是数字“67”不保持不变。如果我不知道“67”是什么,我该如何检索 video_id?
我为你准备了一个快速 Demo。
理想情况下,您会找到一种方法将键设置为语义名称而不是 '67'
。但如果你不能,而且它总是不同的,那么你最好的选择是检查 预期值 .
由于您需要一个序列化数组,我们可以通过 运行 通过 unserialize()
函数检查序列化值。 注意: 这将触发 E_NOTICE 级别的错误,因此您可能希望用 @unserialize()
抑制那些错误(@
抑制错误)。虽然抑制错误通常不是一个好主意,这些是我们预期会触发的错误,因此忽略它们应该是安全的。
因此,当我们通过 unserialize()
传递内容时,我们可以检查它是否将 $undid
设置为真值。一旦完成,我们需要确保我们拥有 正确的 序列化信息,这样我们就可以查看是否设置了 $undid[0]['video_id']
,如果是,则回显该值(或其他任何内容)否则你想用它来做),然后 break
foreach
循环,因为一旦满足我们的条件就不再需要 运行。
这并不是最完美的解决方案,但除非您能弄清楚如何命名该键的语义,如 file_upload_array
,否则最好的选择是遍历这些值,直到找到您需要的值。只要您没有难以想象的字段数量,这应该会很快工作。
$entry = [
[
'id' => 1387,
'form_id' => 2,
'date_created' => '2018-05-17 21:34:37',
'67' => 'a:1:{i:0;a:7:{s:17:"wp_attachement_id";i:5828;s:9:"mime_type";s:9:"video/mp4";s:9:"file_path";s:89:"/home/xxxxxxx/public_html/wp-content/uploads/2018/05/703c94b2b97a6479113d9e3020952891.mp4";s:5:"title";s:3:"xxx";s:11:"description";s:3:"xxx";s:8:"video_id";s:6:"QRSTUV";s:9:"video_url";s:43:"https://www.youtube.com/watch?v=QRSTUV22222";}}',
'36' => 'New Harpshire',
'34' => 'Borristown',
]
];
foreach( $entry[0] as $key => $val ){
if( $undid = @unserialize( $val ) ){ // unserialize returns E_NOTICE warnings on non-serialized items. @ suppresses that.
if( isset( $undid[0]['video_id'] ) ){ // Make sure this is the correct serialized field
echo $undid[0]['video_id'];
break;
}
}
}