Remix the string based on array - php

I have a simple whiteboard question:
Create a function that takes both a string and an array of numbers as arguments. Rearrange the letters in the string to be in the order
specified by the index numbers. Return the "remixed" string. Examples
remix("abcd", [0, 3, 1, 2]) ➞ "adbc"
I submitted my code but it's not being accepted and I am unable to see why. I wrote:
function remix($str, $arr) {
$strArr = str_split($str);
for($i = 0; $i < count($strArr); $i++) {
$arr[$i] = $strArr[$arr[$i]];
}
return implode("", $arr);
}
remix("computer", [0, 2, 1, 5, 3, 6, 7, 4]); // ➞ "cmourpte"
Can anyone see something wrong with it? It's always regular characters, no special cases FYI. Very confused.

It looks like the assignment part is putting the value the wrong way round (i.e. it should be assigning the char at position $i to $arr[$i])...
function remix($str, $arr) {
$strArr = str_split($str);
for($i = 0; $i < count($strArr); $i++) {
$strArr[$arr[$i]] = $str[$i];
}
return implode("", $strArr);
}
which for
echo remix("PlOt", [1, 3, 0, 2]).PHP_EOL;
echo remix("computer", [0, 2, 1, 5, 3, 6, 7, 4]);
gives
OPtl
cmourpte
Just to check, this passes the test.

Well it would seem you missed that the remix was giving an incorrect result.
But I would have done it this way as by default a PHP String is in fact an array already.
function remix($str, $arr) {
$mixed = '';
foreach ($arr as $i) {
$mixed .= $str[$i];
}
return $mixed;
}
echo remix("computer", [0, 2, 1, 5, 3, 6, 7, 4]);
RESULT
cmotperu
In fact if this is the question, the stated answers are wrong in ALL cases.
Create a function that takes both a string and an array of numbers as arguments.
Rearrange the letters in the string to be in the order specified by the index numbers.
Return the "remixed" string.
Examples
remix("abcd", [0, 3, 1, 2]) ➞ "acdb"
The string you'll be returning will have: "a" at index 0, "b" at index 3, "c" at index 1, "d" at index 2, because the order of those characters maps to their corresponding numbers in the index array.
remix("PlOt", [1, 3, 0, 2]) ➞ "OPtl"
remix("computer", [0, 2, 1, 5, 3, 6, 7, 4]) ➞ "cmourpte"

Related

Find the element in array that appears once using php [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
I've got many answer about this question using other language but i want an answer in php language. Any one help me please
This is my array look like
$array = [1, 2, 3, 4, 4, 1, 2, 5, 5, 11, 11];
Use array_count_values() like below:-
<?php
$array = [1, 2, 3, 4, 4, 1, 2, 5, 5, 11, 11];
$array_count_values = array_count_values($array);// get how many times a value appreas inside array
foreach($array_count_values as $key=>$val){ // now iterate over this newly created array
if($val ==1){ // if count is 1
echo $key. " in array come only one time.\n"; // this means value appears only one time inside array
}
}
Output:- https://eval.in/867433 OR https://eval.in/867434
If you want values in an array:-
<?php
$array = [1, 2, 3, 4, 4, 1, 2, 5, 5, 11, 11,13]; // increased one value to show you the output
$array_count_values = array_count_values($array);
$single_time_comming_values_array = [];
foreach($array_count_values as $key=>$val){
if($val ==1){
$single_time_comming_values_array[] = $key;
}
}
print_r($single_time_comming_values_array);
Output:- https://eval.in/867515
Here, you can use something like this-
<?php
function appearedOnce($arr)
{
$result = 0;
for($i=0; $i<sizeof($arr); $i++)
{
$result = $result ^ $arr[$i];
}
return $result;
}
$num = array(1, 2, 3, 4, 4, 1, 2, 5, 5, 11, 11);
print_r(appearedOnce($num)."\n")
?>
My initial response was to take a more pedestrian approach which works as you may note from this example. Then I chanced upon a related discussion.
Another approach involves sorting the array and then inspecting pairs of numbers for duplicates. The following code is a result of coupling the OP's array with my translation of the presumably C source code of Michael Martin into PHP, as follows:
<?php
$arr = [1, 2, 3, 4, 4, 1, 2, 5, 5, 11, 11];
sort($arr);
for($i = 0, $max = count($arr); $i < $max; $i++){
// is single number last element in array?
if($i == count($arr)-1)
$singleNum = $arr[$i];
// If adjacent elements the same, skip
if($i < count($arr)-1 && $arr[$i] == $arr[$i+1]){
$i++;
}
else
{
// found single number.
$singleNum = $arr[$i];
}
}
var_dump($singleNum);
See live code

Find the most frequent number in PHP array

I have an array in PHP with repeating numbers and I would like to find the most frequent but only when there is only one of that.
while (count(array_count_values($arr)) > 1) {
$minim = min(array_count_values($arr));
while ($minim == min(array_count_values($arr))) {
unset($arr[array_search(array_search(min(array_count_values($arr)), array_count_values($idList)), $arr)]);
$arr = array_splice($arr, 0, 1);
}
}
In my code the first while runs until I have only one number (multiple times) in the array and with the second one I delete the less frequent numbers.
My problem is the I get this error for my second min(): "Array must contain at least one element".
I have an array in PHP with repeating numbers and I would like to find the most frequent but only when there is only one of that.
Your approach seems rather complicated.
Here's how I'd do that:
$numbers = [1, 6, 5, 6, 2, 1, 6, 7, 8]; // positive test case
//$numbers = [1, 6, 5, 6, 2, 1, 6, 7, 8, 1]; // negative test case
$count = array_count_values($numbers); // get count of occurrence for each number
arsort($count); // sort by occurrence, descending
$first = key($count); // get key of first element, because that is the/one
// of the highest number(s)
$count_first = current($count); // get occurrence for first array value
$count_second = next($count); // get occurrence for second array value
if($count_first != $count_second) { // did they occur in different frequencies?
echo $first . ' occurred most in input array.';
}
else {
echo 'input array contained multiple values with highest occurrence.';
}
You could probably perform an array_reduce on the counts to find the max, but because array_reduce does not give you access to the iterable's key, you'd have to perform additional transformation.
Instead, I would recommend you build your own MaxHeap by extending from SplMaxHeap
class MaxHeap extends SplMaxHeap {
public function compare($a, $b) {
if (current($a) < current($b))
return -1;
elseif (current($a) > current($b))
return 1;
else
return 0;
}
}
Then we can use it as such – the answer says [ 7 => 4 ] which means: 7 is the most common number, appearing 4 times
$heap = new MaxHeap();
foreach (array_count_values($numbers) as $n => $count)
$heap->insert([$n => $count]);
print_r($heap->top());
// [ 7 => 4 ]
printf("%d is the most common number, appearing %d times",
key($heap->top()),
current($heap->top())
);
// 7 is the most common number, appearing 4 times
complete script
$numbers = [0, 1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8, 8, 9];
class MaxHeap extends SplMaxHeap {
public function compare($a, $b) {
if (current($a) < current($b))
return -1;
elseif (current($a) > current($b))
return 1;
else
return 0;
}
}
$heap = new MaxHeap();
foreach (array_count_values($numbers) as $n => $count)
$heap->insert([$n => $count]);
printf("%d is the most common number, appearing %d times",
key($heap->top()),
current($heap->top())
);
revision history
I was unaware of PHP's native array_count_values function. I removed the more complex array_reduce in favor of this super specialised function. Thanks, #CBroe.

PHP merge 2 arrays with different number of elements, $keys from one, $values from another

I want to merge 2 arrays together that have a different number of elements, using the keys from one and the values from another where/if the keys match. The array that contains the desired values may have less elements in it although I would like to retain the resulting empty keys from the original array. For example:
//Array that contains keys I would like to retain
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
//Array that contains values I'd like to use
$arr2 = array(01=>123, 03=>123, 05=>123, 07=>123, 09=>123, 11=>123);
//The desired result with some valueless elements
$results = array(01=>123, 02, 03=>123, 04, 05=>123, 06, 07=>123, 08, 09=>123, 10, 11=>123, 12);
As you can see the results array retains 12 elements but only applies values to where the keys from the 2 arrays match.
I have tried $results = array_intersect_key($arr1 + $arr2, $arr2); among other PHP functions as well as:
for ($i=1; $i < count($arr1); $i++) {
if (isset($arr2[$i])) {
$arr3[] = $arr2[$i];
} else {
$arr3[] = $arr1[$i];
}
}
print_r($arr3);
No luck as yet.
Thanks in advance!
For arrays like this
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
$arr2 = array(1=>123, 3=>123, 5=>123, 7=>123, 9=>123, 11=>123);
this should work.
foreach ($arr1 as $key) {
$results[$key] = isset($arr2[$key]) ? $arr2[$key] : null;
}
or using some other PHP functions:
$results = array_replace(array_fill_keys($arr1, null), $arr2);
//Array that contains keys I would like to retain
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
//Array that contains values I'd like to use
$arr2 = array(1=>123, 3=>123, 5=>123, 7=>123, 9=>123, 11=>123);
$result = array_fill_keys(
$arr1,
null
);
array_walk(
$result,
function(&$value, $key) use($arr2) {
$value = (isset($arr2[$key])) ? $arr2[$key] : null;
}
);
var_dump($result);
First set your $arr1's values to false to retain just the keys:
$arr1 = array_fill_keys(array_keys($arr1), false); Or if you're generating $arr1 yourself, define it as such to start with: $arr1 = Array(false, false, false, false /* etc. */);
Now use the array union operator:
$result = $arr2 + $arr1;
The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays — from the docs: http://php.net/manual/en/language.operators.array.php)
Then if required sort the array by key: ksort($array);

PHP array_intersect() till the first match

I have 2 arrays to compare and find if there is at least a single value in common.
This works just fine:
$arr1 = array(1, 2, 3, 4, 5);
$arr2 = array(2, 3, 4, 5, 6);
if (array_intersect($arr1, $arr2)) {
// good, at least one match found
}
However, the question is performance. It doesn't make sense to continue looping thru the arrays after the first match was found. Is there a native PHP function or a useful snippet to achieve this?
Will a combination of foreach() and in_array() do the trick?
How about this?
foreach ($arr1 as $key => $val) {
if (in_array($val, $arr2)){
// do something, maybe return so you wouldn't need break
break;
}
}
Just compare the first value?
$arr1 = array(1, 2, 3, 4, 5);
$arr2 = array(2, 3, 4, 5, 6);
if (array_intersect($arr1, $arr2)[0]) {
// good, at least one match found
}

dynamically build and populate table with php array

let's say I have these two arrays:
$array1 = array(1, 2, 3, 4, 5);
$array2 = array(6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
As you can see, my arrays have different lengths. What I'm trying to do is to input these array values into an HTML table with the first column containing the values coming from $array1 and the second column containing the values coming from $array2. So, in this case right here, I should have a table of 10 rows (because $array2 contains 10 elements) and 2 columns (because I have 2 arrays). Also, I cannot know in advance which array is going to have more elements than the other (so, $array1 could be bigger than $array2, they could also have equal sizes). So, depending on which array has more elements, the number of rows in my table should adjust accordingly.
Any idea please?
Thank you
$array2 = array(6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
$array1 = array(1, 2, 3, 4, 5);
$a=count($array1);
$b=count($array2);
echo "<table border=1><tr><th>Array1</th><th>Array2</th></tr>";
if($a > $b)
{
for($i=0;$i<$a;$i++)
{
echo "<tr><td>".$array1[$i]."</td>";
echo "<td>".$array2[$i]."</td></tr>";
}
}
if($b > $a)
{
for($i=0;$i<$b;$i++)
{
echo "<tr><td>".$array1[$i]."</td>";
echo "<td>".$array2[$i]."</td></tr>";
}
}
echo "</table>";
Try thinking of some thing like below
this will give you atleast an idea of how to iterate them.
$array = array($array1,$arry2);
for($i = 0; $i < $array.length; $i++)
{
$rows = $array[$i];
for($j=0; $j< $rows.length; $rows++){
}
}
i hope you can figure out the logic required from this . in case it doesnt work out post comment and we will walk through

Categories