Как проверить, сколько раз одно число входит в другое число и создать массив на основе этого в php?

Предположим, у меня есть:

$val = [1, 2, 3, 4, 5, 6, 7, 8];
$s = 3;

шаг 1: foreach $val найти сколько раз $s находится в нем. Это достаточно просто

foreach($val as $c){
if($c > $s) {
$total       = floor($c / $s);
$remainder   = $c % $s;
} else {
$total       = floor($s / $c);
$remainder   = $s % $c;
}
}

Шаг 2: создайте массив, который покажет именно это. Например:

// 3 doesn't go in 1
['segment' => 1]

// 3 doesn't go in 2
['segment' => 2]

// 3 goes once in 3
['segment' => 3]

// 3 goes once in 4 and reminder is 1
['segment' => 3]
['segment' => 1]

// 3 goes once in 5 and reminder is 2
['segment' => 3]
['segment' => 2]

// 3 goes twice in 6 and reminder is 0
['segment' => 3]
['segment' => 3]

// 3 goes twice in 7 and reminder is 1
['segment' => 3]
['segment' => 3]
['segment' => 1]

// 3 goes twice in 8 and reminder is 2
['segment' => 3]
['segment' => 3]
['segment' => 2]

и так далее

я пытался что-то вроде кода ниже, но не могу заставить его работать:

foreach($val as $c){
if($c > $s) {
$total       = floor($c / $s);
$remainder   = $c % $s;
$segment = $s;
} else {
$total       = floor($s / $c);
$remainder   = $s % $c;
$segment = $c;
}

$totalLoop = $c > $s ? $total + $remainder : 1;

var_dump('total: ' . $total . ', reminder: ' . $remainder . ', segment : ' . $segment);

for($i = 1; $i <= $totalLoop; $i++) {
$segment= $c > $s && $totalLoop == $i ? $remainder : $segment;
var_dump('segment: ' . $segment);
}
}

есть идеи?

1

Решение

Использование оператора модуля (который определяет остаток от деления), а затем вычисление того, сколько раз $ s помещается в ваш $ c, является самым быстрым подходом, который я мог бы найти. Должно выглядеть примерно так:

foreach ($val as $c) {
$mod = $c % $s;
$times = ($c-$mod)/$s;
}

$ раз должен быть вашим результатом. После этого вы сможете собрать искомый массив с $ times и $ mod:

$myArray = array();

while ($times > 0) {
$myArray[] = array('segment' => $s);
$times--;
}
$myArray[] = array('segment' => $mod);

Глядя на ваш второй цикл, кажется, что вы в настоящее время всегда получаете только один сегмент, так как вы, кажется, перезаписываете переменную каждый раз, когда цикл выполняется. Это верно?

ОБНОВИТЬ:

Итак, вот что работает для меня (учитывая мое понимание того, чего вы хотите достичь):

<?php

$val = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];

$s = 3;

// Initialize array
$myArray = array();

// loop over each element in $var
foreach ($val as $c) {

// get remainder of divisoin by $s
$mod = $c % $s;

// calculate number of times $s fits into $c
$times = ($c-$mod)/$s;

// add a segment with value of $s to $myArray for each number of times it fits into $c
while ($times > 0) {

// adding an index with value of $c when adding to $myArray
$myArray[$c][] = array('segment' => $s);

// reducing the counter $times in loop
$times--;
}

// output a last segment with value of remainder of division, unless the remainder is 0
if ($mod != 0) {
$myArray[$c][] = array('segment' => $mod);
}
}

// function for pre-formatted output
function prettyPrint($a) {
echo '<pre>'.print_r($a,1).'</pre>';
}

// show results
prettyPrint($myArray);

?>

prettyPrint функция заимствована из Вот.

2

Другие решения

Поздно, но я подумал, что это достойно внимания. Все, что я сделал, это перебрал массив в цикле foreach и проверил модульное число (в данном случае 100). Затем, если true, увеличьте $ var, и мы будем иметь, сколько раз число 100 появляется в массиве:

$o=0;
$var=0;
foreach($video_tags as $video_tagss)
{
if($o === 1) //skip this number as it always comes up with a hit.
{

}
else
{
if($o % 100 == 1) //is the number a multiple of 100?
{
$var = $var + 1; //if yes, increment $var.
}
}

$o++;
}

// $video_tags had a 390 item count, and $var returned number 3.
0

По вопросам рекламы [email protected]