12

保存されたキーを使用して配列をスプライシングする状況に直面したため、次の関数を作成しました。
各アイテムを配列でラップする解決策にたどり着きましたが、メモリ効率の悪いステートメントがいくつかあるようです。
何かアイデアはありますか?
ありがとうございました。


array_splice_pk

これは、 とは異なり、キーを保持しますarray_splice

概要:

  • &$input→1つと同じarray_splice
  • $key-> ターゲット キー。
  • $use_key_as_offset->$keyパラメータを数値オフセットとして使用します。
  • $length→1つと同じarray_splice
  • $replacement→1つと同じarray_splice。ただし、各値にキーを提供することもできます。

コード:

function array_splice_pk(&$input, $key, $use_key_as_offset = false, $length = 0, $replacement = null) {
    if (!is_array($input) || !is_scalar($key)) {
        return array();
    }
    if ($replacement !== null) {
        $replacement = array($replacement);
        if (!is_array($replacement[0])) {
            $replacement = array($replacement);
        }
    }
    $wrapper = array();
    foreach ($input as $k => $v) {
        $wrapper[] = array($k => $v);
    }
    $del_key = null;
    foreach ($wrapper as $k => $v) {
        if ($use_key_as_offset) {
            if ($k === (int)$key) {
                $del_key = $k;
                break;
            }
        } else {
            if (key($v) == $key) {
                $del_key = $k;
                break;
            }
        }
    }
    if ($del_key === null) {
        return array();
    }
    if ($replacement === null) {
        $wrapper_ret = array_splice($wrapper, $del_key, $length);
    } else {
        $wrapper_ret = array_splice($wrapper, $del_key, $length , $replacement);
    }
    $ret = $input = array();
    foreach ($wrapper_ret as $wrap) {
        list($k, $v) = each($wrap);
        $ret[$k] = $v;
    }
    foreach ($wrapper as $wrap) {
        list($k ,$v) = each($wrap);
        $input[$k] = $v;
    }
    return $ret;
}

サンプル:

$arr1 = $arr2 = array(
    'one'   => 'test',
    'two'   => 'test',
    'three' => 'test',
    'four'  => 'test',
);
$ret1 = array_splice_pk($arr1, 'three', false, 1, array('fizz' => '!!!'));
$ret2 = array_splice_pk($arr2, 2      , true , 1, array('fizz' => '!!!'));

var_dump('Result1', $arr1, $ret1, 'Result2', $arr2, $ret2);

結果:

string(7) "Result1"
array(4) {
  ["one"]=>
  string(4) "test"
  ["two"]=>
  string(4) "test"
  ["fizz"]=>
  string(3) "!!!"
  ["four"]=>
  string(4) "test"
}
array(1) {
  ["three"]=>
  string(4) "test"
}
string(7) "Result2"
array(4) {
  ["one"]=>
  string(4) "test"
  ["two"]=>
  string(4) "test"
  ["fizz"]=>
  string(3) "!!!"
  ["four"]=>
  string(4) "test"
}
array(1) {
  ["three"]=>
  string(4) "test"
}
4

3 に答える 3

8

array_sliceのマニュアルでこれを見つけました。

<?php
function array_splice_assoc(&$input, $offset, $length, $replacement = array()) {
    $replacement = (array) $replacement;
    $key_indices = array_flip(array_keys($input));
    if (isset($input[$offset]) && is_string($offset)) {
            $offset = $key_indices[$offset];
    }
    if (isset($input[$length]) && is_string($length)) {
            $length = $key_indices[$length] - $offset;
    }

    $input = array_slice($input, 0, $offset, TRUE)
            + $replacement
            + array_slice($input, $offset + $length, NULL, TRUE); 
}

 $fruit = array(
    'orange' => 'orange',
    'lemon' => 'yellow',
    'lime' => 'green',
    'grape' => 'purple',
    'cherry' => 'red',
 );

  // Replace lemon and lime with apple
  array_splice_assoc($fruit, 'lemon', 'grape', array('apple' => 'red'));

  // Replace cherry with strawberry
  array_splice_assoc($fruit, 'cherry', 1, array('strawberry' => 'red'));
  ?>

キーを保持しながら、スペースと時間の効率が向上します。

于 2013-05-16T15:25:51.843 に答える
4

置換配列のキーを保持し、元の関数と同じ引数リストを持つ関数を次に示します。array_splice

<?php

function array_splice_preserve_keys(&$input, $offset, $length=null, $replacement=array()) {
    if (empty($replacement)) {
        return array_splice($input, $offset, $length);
    }

    $part_before  = array_slice($input, 0, $offset, $preserve_keys=true);
    $part_removed = array_slice($input, $offset, $length, $preserve_keys=true);
    $part_after   = array_slice($input, $offset+$length, null, $preserve_keys=true);

    $input = $part_before + $replacement + $part_after;

    return $part_removed;
}

// use as normal
array_splice_preserve_keys($input, $offset, $length, $replacement);

https://github.com/lode/gapsで公開されていることを確認してください。

于 2015-02-04T21:08:23.687 に答える