PHP 迭代键和值,并根据数组键整数差拆分为子数组


php iterate over both keys and values and split into sub-array based on array-keys integer difference

这里

令人头疼,我厌倦了迭代键和值并操纵指针来比较数组键中整数之间的差异。我正在尝试根据数组键大于 1 的减法来拆分和排列这个数组,我很早就注意到这是一种将值分成集群的有效方法,如本问题底部所述。

例如:([0] => 猫[2] =>水果 [3] => 苹果)键等同于:

第 2 - 1

键:2-0 = 2 (2>1)

第 3 - 2

键:3-2 = 1 (1=1)

我已经在问题的底部简要解释了我想要完成的任务。

数组代码如下:

$arr1 = array("cat", "Van", "fruit", "apple", "orange", "banana", "car", "car", "boat", "Bike", "truck", "cat", "dog", "bus", "van", "truck", "Sea", "ocean", "sea", "ship", "train", "Land");
$arr2 = array("cat", "fruit", "apple", "orange", "banana", "cat", "dog", "sea", "ocean", "land");
$array = array_uintersect($arr1, $arr2, 'strcasecmp');
//returns:
Array
(
    [0] => cat
    [2] => fruit
    [3] => apple
    [4] => orange
    [5] => banana
    [11] => cat
    [12] => dog
    [16] => Sea
    [17] => ocean
    [18] => sea
    [21] => Land
)

(下面)是我迄今为止编写的代码,作为我尝试分离的实现,如本问题底部所述:

$arr1 = array("cat", "Van", "fruit", "apple", "orange", "banana", "car", "car", "boat", "Bike", "truck", "cat", "dog", "bus", "van", "truck", "Sea", "ocean", "sea", "ship", "train", "Land");
$arr2 = array("cat", "fruit", "apple", "orange", "banana", "cat", "dog", "sea", "ocean", "land");
foreach($array as &$val){
$array2 = $array;
prev($array);
if(key($array2)-key($array)!==1) { //bool to determine if the difference in keys is only 1 integer apart. 
$val = array($val);
$val[] = "";
}}
unset($val);
print_r(collapse_multi_arrays($array)); //collapse_multi_arrays is a custom function I have to form a single array from multidimensional ones. 
outputs:
Array
(
    [0] => cat
    [1] => 
    [2] => fruit
    [3] => apple
    [4] => orange
    [5] => banana
    [6] => 
    [7] => cat
    [8] => dog
    [9] => 
    [10] => Sea
    [11] => ocean
    [12] => sea
    [13] => 
    [14] => Land
    [15] => 
)

(上面的输出)不确定这是否是迭代数组的最明智方法,但我想使用空值以某种方式进行分块或拆分,以便获得如下所示的内容:

Array
(
    [0] => Array
        (
            [0] => cat
        )
    [1] => Array
        (
            [2] => fruit
            [3] => apple
            [4] => orange
            [5] => banana
        )
    [2] => Array
        (
            [11] => cat
            [12] => dog
        )
    [3] => Array
        (
            [16] => Sea
            [17] => ocean
            [18] => sea
        )
    [4] => Array
        (
            [21] => Land
        )
)

我想我可以附加到每个集群到每个一个值喜欢这个:

Array
(
    [0] => cat
    [1] => fruit apple orange banana
    [2] => cat dog
    [3] => Sea ocean sea
    [4] => Land
)
/

/===

============================================================

总体解释:我总体上想做的是这样的,

由此:

Array
(
    [0] => cat
    [2] => fruit
    [3] => apple
    [4] => orange
    [5] => banana
    [11] => cat
    [12] => dog
    [16] => Sea
    [17] => ocean
    [18] => sea
    [21] => Land
)

对此:

Array
(
    [0] => cat
    [1] => fruit apple orange banana
    [2] => cat dog
    [3] => Sea ocean sea
    [4] => Land
)

这是当数组键的差异仅相隔 1 个整数时将数组值聚类追加在一起。如果数组键整数的差值大于 1,则群集附加的数组值将传递给下一个数组键,如上面的"这个*到这个*"键值对的例子

任何帮助,建议,代码将不胜感激,因为我发现很难迭代键和值来实现这一目标,干杯。

我想到的是一个简单的解决方案,如下所示(经过测试并产生所需的结果):

$a = array(
    0 => 'cat',
    2 => 'fruit',
    3 => 'apple',
    4 => 'orange',
    5 => 'banana',
    11 => 'cat',
    12 => 'dog',
    16 => 'Sea',
    17 => 'ocean',
    18 => 'sea',
    21 => 'Land',
);
$last = 0;
$stack = $grouped = array();
foreach ($a as $key => $val) {
    if ($key - $last > 1) {
        $grouped[] = implode(' ', $stack);
        $stack = array();
    }
    $stack[] = $val;
    $last = $key;
}
$grouped[] = implode(' ', $stack);
print_r($grouped);

我不确定你在这里想实现什么,因为它看起来有点奇怪;)无论你试图解决的根本问题是什么,我认为有一个比这更优雅的解决方案。