730wavy
730wavy

Reputation: 704

skip first value for variable inside of foreach loop php

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

Answers (10)

Sally CJ
Sally CJ

Reputation: 15620

UPDATE #1

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
}

UPDATE #2

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

UPDATE #3

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

Andreas
Andreas

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

https://3v4l.org/l7NBa

Upvotes: 0

Rob Sinton
Rob Sinton

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

Outsource WordPress
Outsource WordPress

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

Saeed.Gh
Saeed.Gh

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

pradip.parkar
pradip.parkar

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

Madhur Bhaiya
Madhur Bhaiya

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

mrbm
mrbm

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

Elementary
Elementary

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

Alex
Alex

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

Related Questions