【问题标题】:PHP array_slice or equivalent on array of arrays that are keyed by IDPHP array_slice 或等效于由 ID 键入的数组数组
【发布时间】:2019-09-21 06:26:13
【问题描述】:

我有一个以uuid's 为键的多维数组,需要通过 uuid 切片/弹出/取消设置元素(即,如果我有 a410463e-7fe2-4fba-8733-a812c0ee8c54 并希望通过该 uuid 删除该项目),以便结果与删除的一项基本相同:

array:5 [
  "5fc29794-9e08-4944-ba6d-4a5fcde5c88b" => array:3 [
    "id" => "5fc29794-9e08-4944-ba6d-4a5fcde5c88b"
    "name" => "fuga"
    "value" => 0
  ]
  "a410463e-7fe2-4fba-8733-a812c0ee8c54" => array:3 [
    "id" => "a410463e-7fe2-4fba-8733-a812c0ee8c54"
    "name" => "nihil"
    "value" => 0
  ]
  "c141d973-91fe-4227-8985-04bd0665f4a8" => array:3 [
    "id" => "c141d973-91fe-4227-8985-04bd0665f4a8"
    "name" => "eaque"
    "value" => 0
  ]
  "17030897-1aa9-487d-a4be-d574dd0c9d9b" => array:3 [
    "id" => "17030897-1aa9-487d-a4be-d574dd0c9d9b"
    "name" => "eveniet"
    "value" => 3
  ]
  "901d9f8f-573f-444f-8562-0cdf5888ba6e" => array:3 [
    "id" => "901d9f8f-573f-444f-8562-0cdf5888ba6e"
    "name" => "in"
    "value" => 6
  ]
]

我知道如何按索引进行切片,但在查找有关如何实现这一点的资源时遇到了麻烦。这是针对phpunit 测试的。我试过unset,但似乎无法将其存储在变量中或仅在断言中调用它:

unset($array1[$id]);
unset($array2[$id]);

不保留更改。

$newUnchanged = unset($array1[$id]);
$oldUnchanged = unset($array2[$id]);

抛出syntax error, unexpected 'unset' 错误。最终,我想断言所有未更改的项目都与更新单个项目之前相同。我也尝试过这个丑陋的业务,它正在删除一个项目,但不是正确的:

$keyOne = array_search($id, array_keys($array1), true);
$oldUnchanged = array_slice($array1, $keyOne, null, true);

$keyTwo = array_search($id, array_keys($array2), true);
$newUnchanged = array_slice($array2, $keyTwo, null, true);

// Shows that the item that I wanted to slice still exists in both arrays
dd($id, $oldUnchanged, $newUnchanged);

// ^ Causes this test to fail
$this->assertEquals($oldUnchanged, $newUnchaged);

【问题讨论】:

  • 所以你只是想根据它的键删除一个项目?
  • 是的。但关键是 id 而不是索引。
  • 好的。我现在有点困惑,因为您示例中的键与 ID 相同。你能解释一下为什么像unset() 这样的东西不起作用吗?另外,你能提供你目前拥有的代码吗?
  • 您要删除哪些项目?您可以将数组包含为 var_export 吗?
  • 我从 unset 开始,但我得到了 syntax error, unexpected 'unset'。我正在尝试删除我拥有该 ID 的任何项目。用例是我只更新其中一项,然后尝试测试所有其他项是否未更改。上面的数组是从 jsonb postgres 列中转换而来的。

标签: php laravel phpunit php-7 php-7.1


【解决方案1】:

我发现我必须先克隆数组才能取消设置

$oldUnchanged = $array1;
unset($oldUnchanged[$id]);

$newUnchanged = $array2;
unset($newUnchanged[$id]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2013-07-17
    • 1970-01-01
    • 2015-12-11
    • 2019-08-24
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多