пропустить первое значение для переменной внутри цикла foreach php - PullRequest
0 голосов
/ 11 сентября 2018

У меня на сайте есть следующая функция, которая собирает все значения из $vid_pix и echos каждое из них или любых связанных переменных в цикле foreach.

Это работает нормально, однако у меня есть переменная - $Pt, которая также выводит эхом .

Прямо сейчас, хотя я пытаюсь сделать это -пропустите первое значение в $Pt.Также установите статическое значение для последнего экземпляра, поскольку все перемещается вверх на 1, оставляя последний без значения.

Я пробовал array_splice и unset, но оно не пропускает первое $Pt значение.

Так что, если бы у меня было -

[vp 1]->[5]
[vp 2]->[10]
[vp 3]->[15]
[vp 4]->[20]

Iпотребовалось бы -

[vp 1]->[10]
[vp 2]->[15]
[vp 3]->[20]
[vp 4]->[x]

(x = мне бы пришлось назначить статическое значение для последней переменной.)

Моя функция (для простоты сокращена)

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

Чтобы поместить вещи в лучший контекст, вот полный код конкретной функции, которую я пытаюсь достичь в пределах -

/*
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);

ОБНОВЛЕНИЕ

var_dump результаты -

string(1) "7"
string(1) "2"
string(1) "6"
string(1) "9"

Следующая ссылка содержит оригинальный код, который сохраняет переменную $Pt - здесь

Ответы [ 10 ]

0 голосов
/ 23 сентября 2018

Вы можете использовать array_slice для удаления одного набора значений из массива и использовать array_merge для слияния его с "x".

Затем вы просто комбинируете ключи и "новые" значения.

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

Это выводит:

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

0 голосов
/ 22 сентября 2018

Как насчет передачи результатов get_post_meta($vP, 'photo_time', false); в функцию, которая сдвигает значения и добавляет в конец статическое значение?

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

Так что, по сути, вы можете просто обернуть существующую функцию следующим образом ....

$pT = shiftPt(get_post_meta($vP, 'photo_time', false));

... и это оставит последнее значение в массиве равным нулю при смещении всех исходных значений вверх.

Если вы хотите указать окончательное значение (например,как 5) тогда вы могли бы сделать ...

$pT = shiftPt(get_post_meta($vP, 'photo_time', false), 5);
0 голосов
/ 23 сентября 2018

ОБНОВЛЕНИЕ # 1

Попробуйте использовать array_shift() так:

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
}

ОБНОВЛЕНИЕ № 2

Если на самом деле есть только один photo_time мета для каждого изображения / вложения (идентификаторы вложений находятся в массиве $vid_pix), то это должно работать:

$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

ОБНОВЛЕНИЕ № 3

Добавьте указанный выше ($Pt2) код выше / перед этим foreach, затем добавьте $i => и измените $Pt, как показано ниже:

foreach ($vid_pix as $i => $vP) {
  $filename = basename( get_attached_file( $vP ));
  $Pt = $Pt2[ $i ];
  ...
}
0 голосов
/ 22 сентября 2018

Как вы уже знаете, вы получаете photo_time каждого vid_pix, и в вашем вопросе я вижу, что вам нужно получить photo_time следующего vid_pix для текущего vid_pix и игнорировать первое photo_time, которое 5 в приведенном примере и последний vid_pix (вместо этого поместите что-нибудь статическое)

[vp 1]->[5]
[vp 2]->[10]
...

Мне понадобится -

[vp 1]->[10]
[vp 2]->[15]
...

так что я думаю, что это просто (я использую vip_pix index в качестве ключа, вы можете использовать все, что угодно)

$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
0 голосов
/ 22 сентября 2018

Вам необходимо переместить массив за пределы цикла, поскольку ваш массив $Pt имеет одно значение. Попробуйте код, приведенный ниже.

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

Надеюсь, это поможет.

0 голосов
/ 20 сентября 2018
$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++;
 }

используйте этот тип счетчика для пропуска значения ....

0 голосов
/ 17 сентября 2018

Как насчет?

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

Проверьте это в прямом эфире здесь: https://repl.it/repls/PerfectUpsetAnalysts

0 голосов
/ 11 сентября 2018

Вы могли бы просто действовать так:

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

вывод:

array(4) {
  ["vp 1"]=>
  int(10)
  ["vp 2"]=>
  int(15)
  ["vp 3"]=>
  int(20)
  ["vp 4"]=>
  int(25)
}
0 голосов
/ 11 сентября 2018

Почему бы не сделать это самым простым способом?

$keys = array_keys($myHashArray);
$values = array_values($myHashArray);
array_shift($keys);
array_shift($values);
$result = array_combine($keys, $values);

Пожалуйста, поправьте меня, если я неправильно понял.

0 голосов
/ 11 сентября 2018

На основании комментариев ОП , $Pt - массив массивов. Поэтому мы просто используем array_shift , чтобы удалить первое значение (массив второго уровня). И добавьте в конец массив статических значений:

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