php迭代键和值,并基于数组键整数差异拆分为子数组

时间:2012-04-28 03:39:31

标签: php multidimensional-array key key-value-coding dynamic-arrays

这里的主要问题是,我厌倦了遍历键和值并操纵指针来对数组键中的整数之间的差异进行比较。我试图基于数组键的减法大于1来拆分和排列这个数组,我很早就注意到这是将值分成簇的有效方法,如本问题的底部所述。

例如:([0] => cat [2] => fruit [3] => apple)键等于:

第二 - 第一把钥匙: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,则附加了簇的数组值将传递给下一个数组键, 如从此 *到此*键值以上示例

任何帮助,建议,代码都会非常感激,因为我发现难以迭代关键和值来实现这一目标,欢呼。

1 个答案:

答案 0 :(得分:0)

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

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

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