【问题标题】:php iterate over both keys and values and split into sub-array based on array-keys integer differencephp 遍历键和值并根据数组键整数差异拆分为子数组
【发布时间】:2012-04-28 03:39:31
【问题描述】:

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

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

2nd - 1st 键: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,则将簇附加的数组值传递给下一个数组键, 如 from this *to this* 上面的键值示例

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

【问题讨论】:

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


    【解决方案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);
    

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

    【讨论】:

    • +1 简单优雅的解决方案!! :) 你帮我省了很多麻烦,因为我自己从来没有处理过类似的事情。该脚本用于文本处理,从列表中查找关键字然后进一步处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多