Reputation: 704
I have the following function on my site which grabs all the values from $vid_pix
, and echos each them or any associated variables in a foreach
loop.
Which works fine, however I have a variable - $Pt
that also gets echoed out as well.
Right now though what I am trying to do is - skip the first value in $Pt
. Also set a static value for the last instance since everything is being moved up 1, leaving the last with no value.
I've tried array_splice
and unset
, but it's not skipping the first $Pt
value.
So if I had -
[vp 1]->[5]
[vp 2]->[10]
[vp 3]->[15]
[vp 4]->[20]
I would need -
[vp 1]->[10]
[vp 2]->[15]
[vp 3]->[20]
[vp 4]->[x]
(x = I would have to assign a static value for the last variable.)
My function (stripped down for simplicity)
$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
foreach ($vid_pix as $vP) {
$Pt = get_post_meta($vP, 'photo_time', false);
array_splice($Pt, 0, 1);
//unset($Pt[0]);
$Pt = get_post_meta($vP, 'photo_time', true);
echo $Pt;
if (last -> $Pt) { // something like this for the last value
$Pt = '5';
}
}
To put things into better context, here's the full code for the specific function I'm trying to achieve this within --
/*
This is for looping through the uploaded pictures
and sorting them and creating a text file.
*/
$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
$data = "ffconcat version 1.0";
$line = '';
usort( $vid_pix, function( $a, $b ){
$aPor = (int) get_post_meta( $a, 'photo_order', true );
$bPor = (int) get_post_meta( $b, 'photo_order', true );
if ( $aPor === $bPor ) {
return 0;
}
return ( $aPor < $bPor ) ? -1 : 1;
} );
foreach ($vid_pix as $vP) {
$filename = basename( get_attached_file( $vP ));
$Pt = get_post_meta($vP, 'photo_time', true);
$Por = get_post_meta($vP, 'photo_order', true);
$static_value=25;
$array=$Pt;
reset($array);//reset the internal pointer
while(false!==($key=key($array))&&null!==key($array)){//check for current key validity
$next=next($array);//get the next value and move the pointer
$array[$key]=$next&&isset($array[$key])?$next:$static_value;//assign the next value to the current key if valid or the static value if false
}
var_dump($Por);
var_dump($array);
// try to determine the pic of the placeholder image
if ($vP === end($vid_pix))
$last_img = $thepath.'/'.$filename;
if ($vstyle === 'Custom') { // if custom timing is chosen
$slide_dur = "\r\nduration ".$Pt;
$filename = basename( get_attached_file( $vP ));
$line .= "file '".$thepath."/".$filename."'".$slide_dur."\r\n";
} else { // if custom timing is NOT chosen
$filename = basename( get_attached_file( $vP ));
$line .= "file '".$thepath."/".$filename."'".$slide_dur."\r\n";
}
$total_items = count($vid_pix);
if ($total_items > 1) { // if total items is more than one
// LAST LINE OF CONCAT TEXT FILE
$lastline = "file '".$last_img."'\r\nduration 2\r\nfile '".$last_img."'";
$isitone = "";
$solopic = "";
// PUT TOGETHER ALL THE LINES FOR THE TEXT FILE
$txtc = $data."\r\n".$line.$lastline;
} else { // if total items is less than one
$isitone = "true";
$solopic = "-loop 1 -probesize 10M -i ".$thepath."/".$filename;
}
}
// SAVE THE TEXT FILE
file_put_contents($thepath.'/paths.txt', $txtc);
UPDATE
var_dump
results -
string(1) "7"
string(1) "2"
string(1) "6"
string(1) "9"
The following link contains the original code which saves the $Pt
variable -- here
Upvotes: 1
Views: 2323
Reputation: 15620
Try using array_shift()
like this:
foreach ($vid_pix as $vP) {
$Pt2 = get_post_meta($vP, 'photo_time', false);
$Pt = array_shift( $Pt2 ); // get first value
$Pt2[] = 'static value';
var_dump( $Pt, $Pt2 ); // test
}
If there's actually just one photo_time
meta for each image/attachment (the attachment IDs are in the $vid_pix
array), then this should work:
$Pt2 = [];
$n = count( $vid_pix );
for ( $i = 0, $j = 1; $i < $n; $i++, $j++ ) {
$Pt2[] = ( $n === $j ) ? 'static value' :
get_post_meta( $vid_pix[ $j ], 'photo_time', true );
}
echo implode( ', ', $Pt2 ); // test
Add the above ($Pt2
) code above/before this foreach
, then add the $i =>
, and change the $Pt
as you can see below:
foreach ($vid_pix as $i => $vP) {
$filename = basename( get_attached_file( $vP ));
$Pt = $Pt2[ $i ];
...
}
Upvotes: 1
Reputation: 23958
You can use array_slice to remove one set of value from the array and use array_merge to merge it with the "x".
Then you just combine the keys and "new" values.
$arr = [
'vp 1'=>[5],
'vp 2'=>[10],
'vp 3'=>[15],
'vp 4'=>[20]];
$keys = array_keys($arr);
$values = array_merge(array_slice($arr, 1), ["x"]);
$new = array_combine($keys, $values);
var_dump($new);
This outputs:
array(4) {
["vp 1"]=>
array(1) {
[0]=>
int(10)
}
["vp 2"]=>
array(1) {
[0]=>
int(15)
}
["vp 3"]=>
array(1) {
[0]=>
int(20)
}
["vp 4"]=>
string(1) "x"
}
Upvotes: 0
Reputation: 530
How about passing the results of get_post_meta($vP, 'photo_time', false);
into a function that shifts the values and adds the static value to the end?
function shiftPt($input, $end = null) {
$output = [];
$prevKey = null;
foreach ($input as $key => $value) {
if ($lastKey) $output[$lastKey] = $value;
$lastKey = $key;
}
$output[$key] = $end;
return $output;
}
So essentially you could just wrap your existing function like so...
$pT = shiftPt(get_post_meta($vP, 'photo_time', false));
... and this would leave the last value in the array as null while shifting all of the original values up.
If you wanted to specify the final value (e.g. as 5
) then you could do...
$pT = shiftPt(get_post_meta($vP, 'photo_time', false), 5);
Upvotes: 0
Reputation: 3799
You need to shift the array outside the loop since your $Pt
array has single value. Try the code given below.
$newPt = array(); // initialize new array
$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
foreach ($vid_pix as $vP) {
$Pt = get_post_meta($vP, 'photo_time', false);
// assign to new array
$newPt[] = $Pt;
}
// remove first value
array_shift( $newPt );
// add static value to end of the array
$static = '5';
$newPt[] = array( $static );
// print updated array
var_dump($newPt);
Hope this helps.
Upvotes: 0
Reputation: 1305
As you already know you are getting photo_time
of each vid_pix
and in your question I see you need to get photo_time
of next vid_pix
for current vid_pix
and ignore the first photo_time
which is 5 in provided example and the last vid_pix
(put something static instead)
[vp 1]->[5]
[vp 2]->[10]
...
I would need -
[vp 1]->[10]
[vp 2]->[15]
...
so I think its simple (I use vip_pix index
as key, you can use whatever)
$pt_result = [];
for ($i = 0; $i < count($vid_pix) - 1; ++$i) {
$pt_result[$vid_pix[$i]] = get_post_meta($vid_pix[$i+1], 'photo_time', true);
}
$pt_result[$vid_pix[$i]] = 25; //set last one statically
Upvotes: 0
Reputation: 97
$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
$i = 0;
foreach ($vid_pix as $vP) {
if($i ==0){
continue;
}
$Pt = get_post_meta($vP, 'photo_time', false);
array_splice($Pt, 0, 1);
//unset($Pt[0]);
$Pt = get_post_meta($vP, 'photo_time', true);
echo $Pt;
if (last -> $Pt) { // something like this for the last value
$Pt = '5';
}
$i++;
}
use this type of counter for skipping value....
Upvotes: 0
Reputation: 28834
Based on OP's comments, $Pt
is an array of array. So we simply use array_shift to remove the first value (second level array). And, append an array of static value to the end:
$vid_pix = get_post_meta($v_Id, 'vid_pix', false);
foreach ($vid_pix as $vP) {
$Pt = get_post_meta($vP, 'photo_time', false);
// $Pt is an array of array
// remove the first key (first array)
$first_key = array_shift($Pt);
// Add the static value to end of the array. eg: '5'
$static_value = '5'; // define static value
$Pt[] = array($static_value);
// print them out
var_dump($Pt);
}
Upvotes: 1
Reputation: 2194
How about ?
$new_array = array_combine( // to make an array from $keys / values
array_keys($old_array), // use the old same keys
array_merge( // the array containing your new values
array_splice($old_array, 1), // remove the first element
[$static_value] // add the static value
)
);
Check it in live here : https://repl.it/repls/PerfectUpsetAnalysts
Upvotes: 0
Reputation: 1453
you could simply proceed like this:
$static_value=25;
$array=['vp 1'=>5,'vp 2'=>10,'vp 3'=>15,'vp 4'=>20];
reset($array);//reset the internal pointer
while(false!==($key=key($array))&&null!==key($array)){//check for current key validity
$next=next($array);//get the next value and move the pointer
$array[$key]=$next&&isset($array[$key])?$next:$static_value;//assign the next value to the current key if valid or the static value if false
}
var_dump($array);
output :
array(4) {
["vp 1"]=>
int(10)
["vp 2"]=>
int(15)
["vp 3"]=>
int(20)
["vp 4"]=>
int(25)
}
Upvotes: 0
Reputation: 4811
Why not to do it in the simplest way?
$keys = array_keys($myHashArray);
$values = array_values($myHashArray);
array_shift($keys);
array_shift($values);
$result = array_combine($keys, $values);
Please correct me if I understood it wrong.
Upvotes: 0